33

我试图使用动态 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 替换字符串

4

5 回答 5

40

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

比较:

请参阅我之前的回答中的倒数第二个。


除了在 PL/PgSQL 中不运行之外,您的 SQL 语句是错误的,它不会按照您的预期运行。如果(select id from ids where condition = some_condition)返回 say ,如果是整数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_tableor "result_42_table"。你必须写一些更像:

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

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

于 2012-10-08T10:59:01.470 回答
21
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)
于 2017-10-13T02:29:19.820 回答
5

尝试使用

RETURN QUERY EXECUTE '<SQL Command>'

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

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

于 2015-08-22T10:12:19.577 回答
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 '''

所以,也许这有帮助,也可能没有。我希望它至少对我的情况有帮助!

最良好的祝愿。

于 2018-10-31T00:22:07.263 回答
0

EXECUTE 仅适用于 pl/pqsql 环境。

而不是 EXECUTE 尝试使用 SELECT

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

输出将是动态查询。

于 2012-10-08T11:06:38.700 回答