Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在postgres动态sql中使用数组作为参数_Sql_Arrays_Postgresql_Dynamic Sql_Execute - Fatal编程技术网

在postgres动态sql中使用数组作为参数

在postgres动态sql中使用数组作为参数,sql,arrays,postgresql,dynamic-sql,execute,Sql,Arrays,Postgresql,Dynamic Sql,Execute,我正在尝试运行这样的动态查询(只是一个想法): 问题是,我的params数组可以有可变长度——我可以准备一个适当的select查询,但我希望使用“using”子句执行它,数组中包含所有标记为$的参数 可能是这样的,或者我应该使用已经放入语句中的值构建整个select语句(但是,这是我想要避免的)。数组本身就是参数的可能值,因此它不能同时也是参数值的容器 在您的示例中,pl/pgsql解释器将使用后的整个数组作为$1参数的值 此外,如果语言支持自动数组不设为$N参数,则通常不适合,因为数组中的值被

我正在尝试运行这样的动态查询(只是一个想法):

问题是,我的params数组可以有可变长度——我可以准备一个适当的select查询,但我希望使用“using”子句执行它,数组中包含所有标记为$的参数


可能是这样的,或者我应该使用已经放入语句中的值构建整个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)