Подтвердить что ты не робот

Оператор IN vs ANY в PostgreSQL

В чем разница между оператором IN и ANY в PostgreSQL?
Механизм работы обоих, похоже, один и тот же. Может ли кто-нибудь объяснить это с помощью примера?

4b9b3361

Ответ 1

Логично, цитируя руководство:

IN эквивалентно = ANY.

Но есть два варианта синтаксиса IN и два варианта конструкции ANY. Подробности:

Вариант IN() с набором эквивалентен = ANY() с набором, как показано здесь:

Но второй вариант каждого не эквивалентен другому. Второй вариант конструкции 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;