Учитывая, что у меня есть массив, содержащий числа 13777xx в массиве, как мне сгенерировать этот запрос?
Произвольные числа
Если у вас есть фактический массив , просто передайте литерал массива в виде:
'{1377776,1377792,1377793}'
Для небольших массивов, в которых имеется всего несколько значений, вы можете просто использовать конструкцию ANY
в соединении:
SELECT col1, col2
FROM entity
WHERE entityid = ANY ($my_array::int[]);
Для строкового литерала вам понадобится явное приведение типа, как показано.
Для длинных массивов будет более эффективно развернуть массив в набор (производную таблицу), а затем соединить , как прокомментировал mu :
SELECT col1, col2
FROM unnest(my_array::int[]) ex(entityid)
JOIN entity USING (entityid);
С соответствующим именем столбца для неопубликованных чисел вы можете удобно использовать короткое предложение USING
для условия соединения.
Обратите внимание на небольшую разницу: первый запрос неявно складывает дубликаты во входных данных, а второй с объединением создает дубликаты для дубликатов во входных данных. Ваш выбор.
В качестве альтернативы вы также можете передать отдельные значения в выражение IN
. Но это обычно медленнее. (Опять же: складывает дубликаты.) Как:
...
WHERE entityid IN (1377776, 1377792, 1377793);
См:
Для повторных операций вы можете создать функцию VARIADIC
и передать отдельные числа в качестве параметров (или литерал одного массива, по вашему выбору). См:
Не очень произвольные числа
Если вы действительно хотите, чтобы ваш запрос основывался на "числах 13777xx" , что означает все числа от 1377700 до 1377799, используйте вместо этого generate_series()
. Как:
SELECT col1, col2
FROM generate_series(1377700, 1377799) entityid
JOIN entity USING (entityid);
Или, самое простое и быстрое, адаптировать предложение WHERE
с предикатом одного диапазона:
SELECT col1, col2
FROM entity
WHERE entityid BETWEEN 1377700 AND 1377799;