PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

IN rispetto a QUALSIASI operatore in PostgreSQL

(Né INANY è 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 con in
  • 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;