(Нито 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;