В чем разница между оператором IN
и ANY
в PostgreSQL?
Механизм работы обоих, похоже, один и тот же. Может ли кто-нибудь объяснить это с помощью примера?
Оператор IN vs ANY в PostgreSQL
Ответ 1
Логично, цитируя руководство:
IN
эквивалентно= ANY
.
Но есть два варианта синтаксиса IN
и два варианта конструкции ANY
. Подробности:
Вариант IN()
с набором эквивалентен = ANY()
с набором, как показано здесь:
Но второй вариант каждого не эквивалентен другому. Второй вариант конструкции ANY
принимает массив (должен быть фактическим типом массива), тогда как второй вариант IN
принимает список значений, разделенных запятыми. Это приводит к различным ограничениям при передаче значений и может также привести к различным планам запросов в особых случаях:
- Индекс не используется с
=any()
, но используется сin
- Передать несколько наборов или массивов значений в функцию
ANY
конструкция более универсальна, так как ее можно комбинировать с различными операторами, а не просто =
. Пример для LIKE
:
SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');
Для большого количества значений, предоставляя набор лучше масштабируется для каждого:
Связанные с:
Инверсия/противоположность/исключение
Инверсия:
SELECT * FROM foo WHERE id = ANY (ARRAY[1, 2]);
"найти строки, где id
не находится в массиве" - это:
SELECT * FROM foo WHERE id <> ALL (ARRAY[1, 2]);
Который так же, как:
SELECT * FROM foo WHERE NOT (id = ANY (ARRAY[1, 2]));
Строки с id IS NULL
не проходят ни одно из этих выражений. Чтобы включить значения NULL
дополнительно:
SELECT * FROM foo WHERE (id = ANY (ARRAY[1, 2])) IS NOT TRUE;