在参数数组中传递一个整数数组

时间:2016-04-25 11:51:17

标签: javascript pg-promise

我正在尝试按照pg-promise docs中的建议在pg-promise的参数数组中传递参数数组。

db.any("SELECT fieldname FROM table WHERE fieldname = $1 AND fieldname2 IN ($2)",
        [1,[[1730442],[1695256]],[487413],[454336]]])
    .then(function (data) {
        console.log("DATA:", data); // print data;
    })
    .catch(); 

但它不起作用,我在参数列表“错误后返回了”缺失。 或者“运算符不存在:整数=整数[]]”错误,如果我将参数替换为:

[1,[1730442]]

当然,如果我这样传递它,它可以工作:

[1,1730442]

当涉及其他参数时,它是传递值数组的正确方法吗?

我还尝试删除$ 2周围的括号,但没有成功。

2 个答案:

答案 0 :(得分:17)

我是pg-promise的作者。

你的例子中有一些混乱......

您在查询中只使用了两个变量,但传递了四个值:

  • 1
  • [[1730442],[1695256]]
  • [487413]
  • [454336]

你的语法没有一个有效的JavaScript,因为你最终使用的是]而没有匹配的开头,所以很难理解你究竟要传入的是什么。< / p>

然后为什么要再次将所有值包装在数组中?我相信它只是IN()语句中你想要的整数列表。

当您想要使用WHERE IN()中的值时,它实际上并不是您要传入的值的数组,而是以逗号分隔的值列表。

如果您将示例更改为以下内容:

db.any('SELECT fieldname FROM table WHERE fieldname = $1 AND fieldname2 IN ($2:csv)',
[1, [1730442,1695256,487413,454336]])

您将获得正确的值列表。

另见:

答案 1 :(得分:3)

另一种可能性是:

db.any("SELECT fieldname FROM table WHERE fieldname = $1 AND fieldname2 = any ($2)",
        [1,[1730442,1695256,487413,454336]])
    .then(function (data) {
        console.log("DATA:", data); // print data;
    })
    .catch(); 

从postgresql手册:https://www.postgresql.org/docs/9.5/static/functions-comparisons.html

  

右侧是带括号的表达式,必须产生一个   数组值。评估左手表达并与之比较   使用给定运算符的数组的每个元素,必须产生一个   布尔结果。任何结果都是&#34; true&#34;如果有任何真实的结果   获得。结果是&#34; false&#34;如果没有找到真正的结果(包括   数组元素为零的情况。)

     

如果数组表达式产生一个空数组,则ANY的结果为   空值。如果左侧表达式产生null,则ANY的结果为   通常为null(尽管非严格的比较运算符可以   可能产生不同的结果)。另外,如果是右手阵列   包含任何null元素,并且不会获得真正的比较结果,   ANY的结果将为null,而不是false(再次,假设严格   比较运算符)。这符合SQL的常规规则   对于空值的布尔组合。

     

某些是ANY的同义词。