(Нито IN нито ANY е "оператор". „Конструкция“ или „синтактичен елемент“.)
Логично , цитирайки ръководството:
INе еквивалентен на= ANY.
Но има дваварианта на синтаксиса от IN и два варианта на ANY . Подробности:
- Как да използвам ANY вместо IN в клауза WHERE с Rails?
IN вземане на комплект е еквивалентен на = ANY вземане на комплект , както е показано тук:
- postgreSQL - in срещу всеки
Но вторият вариант на всеки не е еквивалентен на другия. Вторият вариант на ANY конструкцията приема масив (трябва да е действителен тип масив), докато вторият вариант на IN приема разделен със запетая списък със стойности . Това води до различни ограничения при предаване на стойности и може също водят до различни планове за заявки в специални случаи:
- Индексът не се използва с
=any()но се използва сin - Предаване на множество набори или масиви от стойности на функция
- Как да съпоставим елементи в масив от композитен тип?
ANY е по-универсален
ANY конструкцията е много по-гъвкава, тъй като може да се комбинира с различни оператори, а не само с = . Пример:
SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');
За голям брой стойности, предоставяне на набор мащабира по-добре за всеки:
- Оптимизиране на заявка в Postgres с голям IN
Свързано:
- Може ли PostgreSQL да индексира колони от масиви?
Обръщане / противоположно / изключване
„Намерете редове, където id е в дадения масив":
SELECT * FROM tbl WHERE id = ANY (ARRAY[1, 2]);
Инверсия:"Намерете редове, където id ене в масива":
SELECT * FROM tbl WHERE id <> ALL (ARRAY[1, 2]);
SELECT * FROM tbl WHERE id <> ALL ('{1, 2}'); -- equivalent array literal
SELECT * FROM tbl WHERE NOT (id = ANY ('{1, 2}'));
И трите еквивалентни. Първият с конструктор на масив, другите два с литерал на масив. Типът данни може да бъде извлечен от контекста недвусмислено. В противен случай може да се изисква изрично предаване, като '{1,2}'::int[] .
Редове с id IS NULL не предавайте нито един от тези изрази. За да включите NULL стойности допълнително:
SELECT * FROM tbl WHERE (id = ANY ('{1, 2}')) IS NOT TRUE;