(Né IN
né ANY
è un "operatore". Un "costrutto" o "elemento di sintassi".)
Logicamente , citando il manuale:
IN
è equivalente a = ANY
.
Ma ci sono due varianti di sintassi di IN
e due varianti di ANY
. Dettagli:
- Come utilizzare ANY invece di IN in una clausola WHERE con Rails?
IN
prendere un set è equivalente a = ANY
prendendo un set , come dimostrato qui:
- postgreSQL - in vs qualsiasi
Ma la seconda variante di ciascuna non è equivalente all'altra. La seconda variante di ANY
costrutto accetta un array (deve essere un tipo di array effettivo), mentre la seconda variante di IN
accetta un elenco di valori separato da virgole . Questo porta a diverse restrizioni nel passaggio di valori e può portano anche a piani di query diversi in casi speciali:
- Indice non utilizzato con
=any()
ma usato conin
- Passa più set o array di valori a una funzione
- Come abbinare gli elementi in un array di tipo composito?
ANY
è più versatile
Il ANY
costrutto è molto più versatile, in quanto può essere combinato con vari operatori, non solo =
. Esempio:
SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');
Per un gran numero di valori, fornendo un set scala migliore per ciascuno:
- Ottimizzazione di una query Postgres con un IN grande
Correlati:
- PostgreSQL può indicizzare le colonne dell'array?
Inversione/contrario/esclusione
"Trova le righe in cui id
è nella matrice data":
SELECT * FROM tbl WHERE id = ANY (ARRAY[1, 2]);
Inversione:"Trova le righe in cui id
è non nell'array":
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}'));
Tutti e tre equivalenti. Il primo con il costruttore di array, gli altri due con l'array letterale. Il tipo di dati può essere derivato dal contesto senza ambiguità. Altrimenti, potrebbe essere richiesto un cast esplicito, come '{1,2}'::int[]
.
Righe con id IS NULL
non passare nessuna di queste espressioni. Per includere NULL
valori in aggiunta:
SELECT * FROM tbl WHERE (id = ANY ('{1, 2}')) IS NOT TRUE;