我试图使用动态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
答案 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 '''
因此,这可能有所帮助,或者可能没有帮助。我希望它对我的情况至少有一个帮助!
最良好的祝愿。