【问题标题】:Can I use the result set of an SQL statement stored in a field within another statement? (PostgreSQL)我可以使用存储在另一个语句中的字段中的 SQL 语句的结果集吗? (PostgreSQL)
【发布时间】:2022-11-02 19:13:39
【问题描述】:

我有一个 sql 语句存储在 PostgreSQL 9.4 数据库中。我可以使用存储的语句,在另一个语句中选择它并将结果集用作表吗?

例如:在“pc_preset”表中,“sql_rule”字段中存储了多条带有SQL语句的记录。我可以查询他们:

SELECT
   sql_rule
FROM
   mc_preset
WHERE
   id_preset = 1

这给了我作为字符串的存储语句,例如:

SELECT
   user_id,
   firstname,
   lastname,
   birthdate,
   birthplace_id
FROM
   user
WHERE
   gender_id = 1

现在我想创建另一个语句并将存储语句的结果集用作别名表并将其与其他表连接。

SELECT *
FROM
   RESULT_SET_OF_SQL_RULE AS "table1"
   LEFT JOIN table2 ON table2.birthplace_id = table1.birthplace_id

在另一个示例中,我希望在子选择中使用结果集。

SELECT *
FROM
   table2
WHERE
   birthplace_id IN (SELECT birthplace_id
                     FROM RESULT_SET_OF_SQL_RULE
                     WHERE birthdate < '2000-01-01'
                    )

我不想使用数据库视图,因为存储的语句可以由应用程序中的(管理员)用户修改,因此需要存储在数据库表中。

How can I use an SQL statement stored in a table as part of another statement? 的基础上,我创建了一个 PostgreSQL 函数,但我无法根据需要对其进行修改。

CREATE OR REPLACE FUNCTION exec_mc_preset_sql_rule_get_result_set(preset_id integer)
 RETURNS ??
 LANGUAGE plpgsql
AS $function$
declare
    result_set integer;
    stmt character varying;
begin
    SELECT sql_rule into stmt
    FROM mc_preset
    WHERE id_preset = preset_id;
    
    execute immediate stmt
    ??  into result_set;
    
    return result_set;
end
$function$
;

如果不可能给出完整的结果集,而只能给出一列值的数组,那么最好在第二个参数中指定我想要返回的字段。

  • 我必须如何编写函数
  • 如何在我的语句中使用该函数?

非常感谢。

【问题讨论】:

    标签: sql postgresql postgresql-9.4


    【解决方案1】:

    基本上你可以修改你的语句,然后使用立即执行。 但这可能会导致未定义的错误,因为不能保证 table1 具有出生地 _id。

    CREATE OR REPLACE FUNCTION exec_mc_preset_sql_rule_get_result_set(preset_id integer)
     RETURNS ??
     LANGUAGE plpgsql
    AS $function$
    declare
        result_set integer;
        stmt character varying;
        stmt1 character varying;
    begin
        SELECT sql_rule into stmt
        FROM mc_preset
        WHERE id_preset = preset_id;
        
        --you can add some logic in your stored procedure to understand what to do next
        --and add modification for stored statement before execute immidiate
        stmt1 := 'SELECT * FROM (' || stmt || ') AS table1 LEFT JOIN table2 ON 
                 table2.birthplace_id = table1.birthplace_id';
        
        execute immediate stmt
        ??  into result_set;
        
        return result_set;
    end
    $function$
    ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-17
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      • 2022-10-04
      • 2023-03-21
      • 2020-06-06
      • 2021-11-03
      相关资源
      最近更新 更多