在Postgres的动态SQL查询(dynamic sql query in postgres)

2019-06-18 11:07发布

我试图使用动态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

Answer 1:

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



Answer 2:

尝试使用

RETURN QUERY EXECUTE '<SQL Command>'

这将返回数据转换成表格形式。 你必须使用这个移植到PostgreSQL的存储功能。

我已经对自定义过滤器和自定义排序充分论证使用PostgreSQL的动态查询已创建。 请访问此网址: http://www.dbrnd.com/2015/05/postgresql-dynamic-sql/



Answer 3:

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)


Answer 4:

EXECUTE将只在PL / pqsql环境。

而不是EXECUTE试图用SELECT

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

输出将是动态查询。



Answer 5:

这些都看起来比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 '''

所以,也许这是有帮助的,也可能不是。 我希望它可以帮助至少有一人在我的处境!

最好的祝愿。



文章来源: dynamic sql query in postgres