postgres中的动态sql查询

pst*_*elk 20 postgresql dynamic-sql psql

我试图使用动态SQL在postgres中运行一些查询.

例:

EXECUTE format('SELECT * from result_%s_table', quote_ident((select id from ids where condition = some_condition)))
Run Code Online (Sandbox Code Playgroud)

我必须查询一个表,其格式为result_%s_table,其中,我需要用另一个表替换正确的表名(一个id).

我收到了错误 ERROR: prepared statement "format" does not exist

链接:使用查询结果postgresql进行字符串替换

Cra*_*ger 29

EXECUTE ... USING仅适用于PL/PgSQL - 即在用PL/PgSQL语言编写的函数或DO中.它在纯SQL中不起作用; 的EXECUTE在普通的SQL是完全不同的,用于执行准备的语句.您不能直接在PostgreSQL的SQL方言中使用动态SQL.

相比:

请参阅我之前的答案中的第二个标准.


除了PL/PgSQL之外没有运行你的SQL语句是错误的,它不会做你期望的.如果(select id from ids where condition = some_condition)返回说42,如果id是整数,则语句将失败.如果它被转换成文本你会得到:

EXECUTE format('SELECT * from result_%s_table', quote_ident('42'));
EXECUTE format('SELECT * from result_%s_table', '"42"');
EXECUTE 'SELECT * from result_"42"_table';
Run Code Online (Sandbox Code Playgroud)

那是无效的.你真的想要result_42_table"result_42_table".你必须写更多的东西:

EXECUTE format('SELECT * from %s', quote_ident('result_'||(select id from ids where condition = some_condition)||'_table'))
Run Code Online (Sandbox Code Playgroud)

......如果你必须使用quote_ident.

  • 作为补充,“DO”块始终返回 void 并且不接受任何参数,因此我认为 OP 仅限于函数。 (3认同)
  • @Clodoaldo 好点 - 他们可以执行“SELECT”,但它不会对他们有任何好处,除非他们要做一些真正迂回的事情,比如“SELECT ... INTO”临时表。 (2认同)

Ins*_*hua 9

CREATE OR REPLACE FUNCTION public.exec(
text)
RETURNS SETOF RECORD
LANGUAGE 'plpgsql'
AS $BODY$
BEGIN 
    RETURN QUERY EXECUTE $1 ; 
END 
$BODY$;
Run Code Online (Sandbox Code Playgroud)

用法:

select * from exec('select now()') as t(dt timestamptz)
Run Code Online (Sandbox Code Playgroud)

  • 这对于日常工作来说非常简单而且非常有用... 展示如何将动态查询用作常规查询! (2认同)

Anv*_*esh 5

尝试使用

RETURN QUERY EXECUTE '<SQL Command>'
Run Code Online (Sandbox Code Playgroud)

这会将数据返回到表格形式。您必须将其用于PostgreSQL的存储功能。

我已经使用PostgreSQL的动态查询对自定义过滤器和自定义排序进行了完整的演示。请访问此网址:http : //www.dbrnd.com/2015/05/postgresql-dynamic-sql/