Trovo che QUALSIASI e TUTTO sia molto utile quando non stai solo testando l'uguaglianza o la disuguaglianza. Considera
'blah' LIKE ANY (ARRAY['%lah', '%fah', '%dah']);
come ha usato la mia risposta a questa domanda .
ANY
, ALL
e le loro negazioni possono semplificare notevolmente il codice che altrimenti richiederebbe subquery o CTE non banali e, a mio avviso, sono significativamente sottoutilizzati.
Considera che ANY
funzionerà con qualsiasi operatore. È molto utile con LIKE
e ~
, ma funzionerà con tsquery, test di appartenenza all'array, test delle chiavi hstore e altro.
'a => 1, e => 2'::hstore ? ANY (ARRAY['a', 'b', 'c', 'd'])
oppure:
'a => 1, b => 2'::hstore ? ALL (ARRAY['a', 'b'])
Senza ANY
o ALL
probabilmente dovresti esprimerli come sottoquery o CTE su un VALUES
elenco con un aggregato per produrre un unico risultato. Certo, puoi farlo se vuoi, ma mi atterrò a ANY
.
C'è un vero avvertimento qui:nelle versioni precedenti di Pg, se stai scrivendo ANY( SELECT ... )
, quasi sicuramente starai meglio in termini di prestazioni con EXISTS (SELECT 1 FROM ... WHERE ...)
. Se stai utilizzando una versione in cui l'ottimizzatore girerà ANY (...)
in un join, quindi non devi preoccuparti. In caso di dubbio, controlla EXPLAIN
uscita.