Передавать массив целых чисел в массиве параметров

Я пытаюсь передать массив параметров в массив параметров pg-обещания, как рекомендовано в pg-promocs.

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(); 

Но это не сработает, я возвращаю сообщение "missing" после аргумента "ошибка". Или "оператор не существует: integer = integer []]" ошибка, если я заменю параметры на:

[1,[1730442]]

Конечно, если я так прохожу, он работает:

[1,1730442]

Является ли это правильным способом передачи массива значений, когда задействованы другие параметры?

Я также попытался удалить скобки вокруг $2 без успеха.

Ответ 1

Я автор pg-обещания.


В вашем примере есть некоторая путаница...

Вы используете только две переменные в запросе, но передаете четыре значения:

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

И ваш синтаксис не имеет допустимого JavaScript, так как вы используете ] в конце концов, без соответствующего открывающего, поэтому трудно понять, что именно вы пытаетесь передать.

И тогда зачем снова оборачивать все значения в массивы? Я считаю, что это просто список целых чисел, которые вы хотите внутри оператора IN().

Когда вы хотите использовать значения в WHERE IN(), это не массив этих значений, которые вы хотите передать, это список значений через запятую.

Если вы измените свой пример на следующее:

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

Вы получите правильный список введенных значений.

Смотрите также:

Ответ 2

Другая возможность:

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 является "истинным", если какой-либо истинный результат получен. Результатом является "false", если истинный результат не найден (в том числе случай, когда массив имеет нулевые элементы).

Если выражение массива дает нулевой массив, результат ANY будет ноль. Если левое выражение дает нуль, результат ANY равен обычно недействительным (хотя нестандартный оператор сравнения мог возможно, даст другой результат). Кроме того, если правый массив содержит любые нулевые элементы и не получается истинный результат сравнения, результат ANY будет нулевым, а не ложным (опять же, если принять строгую оператор сравнения). Это соответствует нормальным нормам SQL для булевых комбинаций нулевых значений.

SOME - синоним ЛЮБОГО.