(Ani IN
ani ANY
je „operátor“. "konstrukt" nebo "prvek syntaxe".)
Logicky , cituji manuál:
IN
je ekvivalentní= ANY
.
Existují ale dvě syntaktické varianty z IN
a dvě varianty ANY
. Podrobnosti:
- Jak použít ANY místo IN v klauzuli WHERE s Rails?
IN
používání sady je ekvivalentní = ANY
pořízení sady , jak je ukázáno zde:
- postgreSQL – in vs. jakýkoli
Ale druhá varianta každé není ekvivalentní té druhé. Druhá varianta ANY
konstrukt bere pole (musí jít o skutečný typ pole), zatímco druhá varianta IN
přebírá seznam hodnot oddělený čárkami . To vede k různým omezením při předávání hodnot a může také ve zvláštních případech vést k různým plánům dotazů:
- Index se nepoužívá s
=any()
ale používá se sin
- Předejte funkci více sad nebo polí hodnot
- Jak spárovat prvky v poli složeného typu?
ANY
je všestrannější
ANY
konstrukt je mnohem všestrannější, protože jej lze kombinovat s různými operátory, nejen s =
. Příklad:
SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');
Pro velký počet hodnot poskytnutí množiny měří se lépe pro každého:
- Optimalizace dotazu Postgres s velkým IN
Související:
- Může PostgreSQL indexovat sloupce pole?
Inverze / opak / vyloučení
„Najít řádky, kde je id
je v daném poli":
SELECT * FROM tbl WHERE id = ANY (ARRAY[1, 2]);
Inverze:„Najít řádky, kde je id
není v poli":
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}'));
Všechny tři ekvivalentní. První s konstruktorem pole, další dva s literálem pole. Datový typ lze jednoznačně odvodit z kontextu. Jinak může být vyžadováno explicitní obsazení, například '{1,2}'::int[]
.
Řádky s id IS NULL
nepředávejte žádný z těchto výrazů. Chcete-li zahrnout NULL
hodnoty navíc:
SELECT * FROM tbl WHERE (id = ANY ('{1, 2}')) IS NOT TRUE;