postgres中的动态sql查询

时间:2012-10-08 10:54:30

标签: postgresql dynamic-sql psql

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

示例:

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

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

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

链接:string substitution with query result postgresql

5 个答案:

答案 0 :(得分:26)

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

比较

请参阅my prior answer中的第二个标准杆。


除了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';

那是无效的。您实际上需要result_42_table"result_42_table"。你必须写更多的东西:

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

...如果您必须使用quote_ident

答案 1 :(得分:5)

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

用法:

select * from exec('select now()') as t(dt timestamptz)

答案 2 :(得分:4)

尝试使用

RETURN QUERY EXECUTE '<SQL Command>'

这会将数据返回到表格的形式。你必须将它用于PostgreSQL的存储函数。

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

答案 3 :(得分:1)

EXECUTE 仅适用于pl / pqsql环境。

而不是EXECUTE尝试使用SELECT

 SELECT format('SELECT * from result_%s_table', quote_ident((select id from ids where condition = some_condition))

输出将是动态查询。

答案 4 :(得分:1)

所有这些看起来都比OP的问题复杂。一种不同的格式应该可以解决问题..但是绝对是我不理解的情况。

根据我对OP问题的理解,我认为处于类似情况的其他人可能会从我的理解中受益。

我在Redshift上使用Postgre,遇到了这个问题并找到了解决方案。

我试图创建一个动态查询,并输入自己的日期。

date = dt.date(2018, 10, 30)

query = ''' select * from table where date >= ''' + str(my_date) + ''' order by date '''

但是,以这种方式键入查询时,查询将完全忽略条件。

但是,如果使用百分号(%),则可以正确插入日期。

写上述语句的一种正确方法是:

query = ''' select * from table where date >= ''' + ''' '%s' ''' % my_date + ''' order by date '''

因此,这可能有所帮助,或者可能没有帮助。我希望它对我的情况至少有一个帮助!

最良好的祝愿。

相关问题