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

时间:2014-09-12 09:25:26

标签: sql arrays postgresql dynamic-sql execute

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

    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语句(但是,这是我想要避免的)。

2 个答案:

答案 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中单引号整数是合法的。