Javascript 在参数数组中传递整数数组

Javascript 在参数数组中传递整数数组,javascript,pg-promise,Javascript,Pg Promise,我正在尝试传递pg promise的参数数组中的一个参数数组,如中所建议的 但它不起作用,我返回了一个“缺少(missing)after-argument list”错误。 或“运算符不存在:整数=整数[]”错误,如果我将参数替换为: [1,[1730442]] 当然,如果我像这样通过它,它会起作用: [1,1730442] 当涉及其他参数时,这是传递值数组的正确方法吗 我还试图删除$2的括号,但没有成功。我是这本书的作者 你的例子中有些混乱 您在查询中只使用了两个变量,但传入了四个值:

我正在尝试传递pg promise的参数数组中的一个参数数组,如中所建议的

但它不起作用,我返回了一个“缺少(missing)after-argument list”错误。 或“运算符不存在:整数=整数[]”错误,如果我将参数替换为:

[1,[1730442]]
当然,如果我像这样通过它,它会起作用:

[1,1730442]
当涉及其他参数时,这是传递值数组的正确方法吗

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

我是这本书的作者


你的例子中有些混乱

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

  • 1
  • [[1730442],[1695256]
  • [487413]
  • [454336]
而且你的语法没有一个有效的JavaScript,因为你最后使用的是
]
,没有匹配的开头,所以很难理解你到底想传递什么

那么为什么要再次将所有值包装在数组中呢?我相信它只是一个整数列表,您希望它包含在
IN()
语句中

如果要在
中使用值,而在()
中使用值,则实际上不是要传入的那些值的数组,而是以逗号分隔的值列表

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

db.any('SELECT fieldname FROM table WHERE fieldname = $1 AND fieldname2 IN ($2:csv)',
[1, [1730442,1695256,487413,454336]])
您将获得正确的值列表

另见:

  • 例如

    • 另一种可能性是:

      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手册:

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

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

      SOME是ANY的同义词


      在您的示例中,您没有将整数数组作为参数传入,而是一个整数数组数组。你到底想要哪一个?谢谢你详尽的回答。第三个]是因为我同时传递了一个整数和一个整数数组。我没有注意到文档中的($2:csv)符号。@Stanislasdrg它在和中;)刚刚测试过,它可以工作。再次感谢您的帮助和这个很棒的库。我觉得您刚刚把我的SQL技能提高了一个水平。我很好奇,你是否有过这种方法的性能测试经验?你认为这通常表现得更好吗?因为它可以成为一个事先准备好的陈述,或者只是与形式相符?Other?回答了我自己的问题-与8.2相同:
      在现有版本中,带有In(标量常量列表)的表单可以优化为indexscan,但=ANY(数组)不能。8.2将等价地处理它们(事实上,它将(…)转换为=ANY(数组[…])!)。因此,根据您的时间范围,您可能希望坚持使用更干净的调用代码。你好,汤姆·莱恩
      来自
      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();