在postgres动态sql中使用数组作为参数
我正在尝试运行这样的动态查询(只是一个想法): 问题是,我的params数组可以有可变长度——我可以准备一个适当的select查询,但我希望使用“using”子句执行它,数组中包含所有标记为$的参数在postgres动态sql中使用数组作为参数,sql,arrays,postgresql,dynamic-sql,execute,Sql,Arrays,Postgresql,Dynamic Sql,Execute,我正在尝试运行这样的动态查询(只是一个想法): 问题是,我的params数组可以有可变长度——我可以准备一个适当的select查询,但我希望使用“using”子句执行它,数组中包含所有标记为$的参数 可能是这样的,或者我应该使用已经放入语句中的值构建整个select语句(但是,这是我想要避免的)。数组本身就是参数的可能值,因此它不能同时也是参数值的容器 在您的示例中,pl/pgsql解释器将使用后的整个数组作为$1参数的值 此外,如果语言支持自动数组不设为$N参数,则通常不适合,因为数组中的值被
可能是这样的,或者我应该使用已经放入语句中的值构建整个select语句(但是,这是我想要避免的)。数组本身就是参数的可能值,因此它不能同时也是参数值的容器 在您的示例中,pl/pgsql解释器将使用
后的整个数组作为$1
参数的值
此外,如果语言支持自动数组不设为$N
参数,则通常不适合,因为数组中的值被限制为相同的类型,而$N
参数则不是。即使可以使用将数组扩展到参数列表中(这是不可能的),当您第一次想要混合数据类型时,就会遇到麻烦
您是否使用%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中用单引号引用整数是合法的。为$1
(对于ID
)和标签分配多少和什么值?我认为还有一种很好的方法可以用于您的案例。请访问以下链接:即使这是可能的(事实并非如此),您在第一次混合数据类型时也会遇到麻烦。@Winged Panther:问题是参数的数量、值及其类型未知。参数作为对象集合(可变长度集合)从客户端应用程序传递,我从中获取一个值列表,转换为表,然后。。。是的,这就是问题所在;-)我知道参数类型是问题所在,所以这就是为什么假设使用varchar数组。对于数值参数(假设参数值正确),应正确转换。在转换出现问题的情况下,应该重新发出异常(或者我甚至可以在将异常发送到查询之前对其进行测试)。我关心的是varchar参数——我想确保该过程是经过SQL注入验证的。我认为CraigRinger给出的解决方案是一个很好的方向,因为据我所知,这种格式对于SQL注入是安全的。
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)