我正在尝试按照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周围的括号,但没有成功。
答案 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的同义词。