我正在尝试执行以下动态SQL,但我不知道如何做到这一点:
DROP FUNCTION f_mycross(text, text);
EXECUTE ('CREATE OR REPLACE FUNCTION f_mycross(text, text)
RETURNS TABLE ("registration_id" integer, '
|| (SELECT string_agg(DISTINCT pivot_headers, ',' order by pivot_headers)
FROM (SELECT DISTINCT '"' || qid::text || '" text' AS pivot_headers
FROM answers) x)
|| ') AS ''$libdir/tablefunc'',''crosstab_hash'' LANGUAGE C STABLE STRICT;')
字符串
我对PostgreSQL比较陌生。
1条答案
按热度按时间fxnxkyjh1#
EXECUTE
不是SQL命令。它是PL/pgSQL命令,只能在该过程语言的代码块中使用。例如:字符串
我添加了一些改进并简化了嵌套的
SELECT
查询。要点
IF EXISTS
添加到DROP FUNCTION
,除非您确定该函数存在,或者您希望在不存在时引发异常。DISTINCT
就足够了,不需要在外部的SELECT
中再增加一个DISTINCT
。quote_ident()
在必要的地方自动双引号标识符。否则,您可能会遇到语法错误和SQL注入。EXECUTE
的字符串不需要括号。ORDER BY
,这通常比在外部聚合函数中添加ORDER BY
快得多。