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

hun*_*rex 6 sql postgresql plpgsql 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')
Run Code Online (Sandbox Code Playgroud)

它打印以语句开头的字符串 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
$$
Run Code Online (Sandbox Code Playgroud)

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

错误:“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;
Run Code Online (Sandbox Code Playgroud)

谢谢大家以及你们的耐心!

Abe*_*sto 5

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

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

select * from tmp_view_123;
Run Code Online (Sandbox Code Playgroud)

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

演示