动态PostgreSQL查询中的表和列名称

时间:2018-01-20 08:47:00

标签: postgresql dynamic

我正在努力使用大量使用动态查询的存储过程。其中我需要将现有列的最大值存储到变量中。 Postgres文档说明"如果要使用动态确定的表或列名,则必须以文本方式将它们插入命令字符串"。基于此,我提出了以下声明:

EXECUTE 'SELECT MAX(' || pkColumn::regclass || ') FROM ' ||
tableName::regclass INTO maxValue;

表名似乎没问题,列名触发错误。

我做错了什么? 帕维尔

2 个答案:

答案 0 :(得分:0)

EXECUTE 'SELECT MAX(' || pkColumn ||'::regclass) FROM ' || ...

::regclass是在查询中完成的强制转换。您也可以跳过它,或者将“ - 在PG中的工作方式相同。所以请尝试以下方法之一:

EXECUTE 'SELECT MAX(' || pkColumn || ') FROM ' || ...

EXECUTE 'SELECT MAX("' || pkColumn || '") FROM ' || ...

所有树都应该工作。如果没有 - 请告诉我。在那种情况下,这是我的错,postgresql只是有效。

答案 1 :(得分:0)

没有理由转换参数,因为它们只是标识符。为了更好地控制和可读性,请使用函数format(),,例如:

declare
    pkcolumn text = 'my_column';
    tablename text = 'my_table';

...

execute format('select max(%I) from %I', pkcolumn, tablename)
into maxvalue;