我正在尝试运行这样的动态查询(只是一个想法):
declare
params text[] ;
begin
params := ARRAY['30', 'sometext'];
return execute QUERY 'select id, label from "content" where id>$1 and label = $2' using params;
end ;
问题是,我的params数组可以有可变的长度 - 我可以准备一个合适的选择查询,但我想用"使用"来执行它。子句,包含所有用$标记的参数的数组。
可能是这样的,或者我应该使用已经放在语句中的值来构建整个select语句(但是,这是我想要避免的)。
答案 0 :(得分:1)
数组本身是参数的可能值,因此它也不能是参数值的容器。
在您的示例中,pl / pgsql解释器将USING
之后的整个数组作为$1
参数的值。
此外,如果语言支持自动数组不需要进入$N
参数,它通常不适合,因为数组内的值被约束为相同的类型,而$N
参数不是。
答案 1 :(得分:1)
即使将数组扩展为USING
的参数列表也是可能的(但事实并非如此),您第一次想要混合数据类型时会遇到麻烦。
您是否使用format(..)
说明符查看了%L
?它不会解决混合类型问题,但除此之外它将起作用。
regress=> SELECT format('SELECT a FROM b WHERE z = %L and x = %L and y = %L', VARIADIC ARRAY[1, 2, 3]::integer[]);
format
-------------------------------------------------------
SELECT a FROM b WHERE z = '1' and x = '2' and y = '3'
(1 row)
虽然引用了这些值,但没关系,在SQL中单引号整数是合法的。