PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

IN срещу ВСЕКИ оператор в PostgreSQL

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как Asinh() работи в PostgreSQL

  2. Вграден Postgres за пролетни тестове за зареждане

  3. Увеличете стойност в Postgres

  4. Може ли PostgreSQL да индексира колони от масиви?

  5. Postgres - СЪЗДАВАНЕ НА ТАБЛИЦА ОТ SELECT