13

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

4

2 回答 2

25

我是pg-promise的作者。


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

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

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

并且您的语法没有有效的 JavaScript,因为您]最终使用的 JavaScript 没有匹配的开头,因此很难理解您要传递的究竟是什么。

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

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

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

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

您将获得正确的注入值列表。

也可以看看:

于 2016-04-25T18:05:27.490 回答
4

另一种可能是:

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

右边是一个带括号的表达式,它必须产生一个数组值。使用给定的运算符计算左侧表达式并与数组的每个元素进行比较,该运算符必须产生布尔结果。如果获得任何真结果,则 ANY 的结果为“真”。如果没有找到真正的结果(包括数组有零元素的情况),则结果为“假”。

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

SOME 是 ANY 的同义词。

于 2016-11-03T14:07:51.200 回答