В чем разница между оператором 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;