我试图使用动态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
链接: 字符串替换与查询结果的PostgreSQL
EXECUTE ... USING
只在工作PL / pgSQL的 -即函数内或DO
块写在PL / pgSQL的语言。 它不会在普通的SQL工作; 的EXECUTE
在普通的SQL是完全不同的,用于执行准备的语句。 你不能在PostgreSQL的SQL方言直接使用动态SQL。
相比:
- PL / PGSQL的
EXECUTE ... USING
; 至 - SQL的
EXECUTE
见第2面值最后我以前的答案 。
除不除在运行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
。
尝试使用
RETURN QUERY EXECUTE '<SQL Command>'
这将返回数据转换成表格形式。 你必须使用这个移植到PostgreSQL的存储功能。
我已经对自定义过滤器和自定义排序充分论证使用PostgreSQL的动态查询已创建。 请访问此网址: http://www.dbrnd.com/2015/05/postgresql-dynamic-sql/
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)
EXECUTE
将只在PL / pqsql环境。
而不是EXECUTE试图用SELECT
SELECT format('SELECT * from result_%s_table', quote_ident((select id from ids where condition = some_condition))
输出将是动态查询。
这些都看起来比OP的问题更加复杂。 不同的格式应该做的伎俩..但它绝对可以的情况下,我不明白。
从我怎么会看OP的问题,我想其他人在类似情况下可能我是如何得到受益。
我使用红移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 '''
所以,也许这是有帮助的,也可能不是。 我希望它可以帮助至少有一人在我的处境!
最好的祝愿。