繁体   English   中英

如何在 pgadmin 的 Postgresql 中运行从 SELECT FORMAT 构建的查询中获取结果?

[英]How to run get the result from a query built from SELECT FORMAT in Postgresql at pgadmin?

我有一个在 pgadmin 中运行的命令,如下所示:

SELECT format('SELECT * FROM %I.%I CROSS JOIN LATERAL json_to_record(%I::json) AS rs(%s)', 'public', 'vehicles', 'column_A', array_to_string(
               (SELECT ARRAY(SELECT DISTINCT col FROM vehicles CROSS JOIN LATERAL json_object_keys(column_A::json) AS t(col) ORDER BY col)), ' text , '
 ) || ' text')

它打印一个以SELECT语句开头的字符串。

如何直接从FORMAT返回的字符串中获取查询结果?

我试过类似的东西:

DO
$$

WITH str as( SELECT format('SELECT * FROM %I.%I CROSS JOIN LATERAL json_to_record(%I::json) AS rs(%s)', 'public', 'vehicles', 'column_A', array_to_string(
               (SELECT ARRAY(SELECT DISTINCT col FROM vehicles CROSS JOIN LATERAL json_object_keys(column_A::json) AS t(col) ORDER BY col)), ' text , '
 ) || ' text'))

BEGIN EXECUTE str;

END
$$

但是,我收到一条错误消息:

错误:“WITH”处或附近的语法错误

我在这里错过了什么? 请指教!!

更新的答案

结合以下专家的回答后,以下是更新版本以供将来参考:

do $$
DECLARE
   query text;
begin
    query := format('SELECT * FROM %I.%I CROSS JOIN LATERAL json_to_record(%I::json) AS rs(%s)', 'public', 'vehicles', 'column_A', array_to_string(
               (SELECT ARRAY(SELECT DISTINCT col FROM vehicles CROSS JOIN LATERAL json_object_keys(column_A::json) AS t(col) ORDER BY col)), ' text , '
 ) || ' text');
    execute format('create or replace temp view tmp_view_vehicles as %s', query);
end $$;

select * from tmp_view_vehicles;

谢谢大家和你们的耐心!

您正在混淆 SQL 和 PL/pgSQL 语法,并且不是以非常一致的方式。

定义一个 PL/pgSQL 变量:

DO
$$DECLARE
   query text;
   result record;
BEGIN
   query := format(...);
   EXECUTE query INTO result;
END;$$;

简单的答案是

do language plpgsql
$$
begin
 EXECUTE format('SELECT ....' <your code here>);
end;
$$;

然而匿名块不返回任何东西。 也许您必须将块塑造为返回表格的 function

  • 编辑

我认为没有直接的方法可以做到这一点 - 动态更改 function 的返回表结构。 但是您可以返回单个 json 列,其中包含键值对。
这是这样一个function:

create or replace function query_to_jsonset(qr text) returns setof json as
$$
begin
    return query execute 'SELECT row_to_json(dyntbl) FROM ('||qr||') AS dyntbl';
end;
$$ language plpgsql;

然后您的查询将看起来很简单:

select js from query_to_jsonset(format(....)) js;

请注意query_to_jsonset是不安全的。

如果您不想创建存储的 function 但想使用匿名do块获取结果,那么您可以使用临时视图:

do $$
begin
    execute format('create or replace temp view tmp_view_123 as select ...', ...);
end $$;

select * from tmp_view_123;

创建的视图仅对当前 session 可见。

演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM