如何 运行 从 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
$$
但是,我收到一条错误消息:
ERROR: syntax error at or near "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;
$$;
但是匿名块不会return任何东西。也许您必须将方块塑造成 table-returning function.
- 编辑
我认为没有一种直接的方法可以做到这一点——动态地改变函数的 return table 结构。但是您 可以 return 单个 json 列,其中包含键值对。
这是这样一个函数:
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
不安全。
如果您不想创建存储函数但想使用匿名 do
块获取结果,那么您可以使用临时视图:
do $$
begin
execute format('create or replace temp view tmp_view_123 as select ...', ...);
end $$;
select * from tmp_view_123;
创建的视图仅对当前会话可见。
我在 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
$$
但是,我收到一条错误消息:
ERROR: syntax error at or near "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;
$$;
但是匿名块不会return任何东西。也许您必须将方块塑造成 table-returning function.
- 编辑
我认为没有一种直接的方法可以做到这一点——动态地改变函数的 return table 结构。但是您 可以 return 单个 json 列,其中包含键值对。
这是这样一个函数:
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
不安全。
如果您不想创建存储函数但想使用匿名 do
块获取结果,那么您可以使用临时视图:
do $$
begin
execute format('create or replace temp view tmp_view_123 as select ...', ...);
end $$;
select * from tmp_view_123;
创建的视图仅对当前会话可见。