Je trouve que ANY et ALL sont très utiles lorsque vous ne testez pas seulement l'égalité ou l'inégalité. Considérez
'blah' LIKE ANY (ARRAY['%lah', '%fah', '%dah']);
comme utilisé ma réponse à cette question .
ANY
, ALL
et leurs négations peuvent grandement simplifier le code qui nécessiterait autrement des sous-requêtes ou des CTE non triviales, et elles sont considérablement sous-utilisées à mon avis.
Considérez que ANY
fonctionnera avec n'importe quel opérateur. C'est très pratique avec LIKE
et ~
, mais fonctionnera avec tsquery, les tests d'appartenance au tableau, les tests de clé hstore, etc.
'a => 1, e => 2'::hstore ? ANY (ARRAY['a', 'b', 'c', 'd'])
ou :
'a => 1, b => 2'::hstore ? ALL (ARRAY['a', 'b'])
Sans ANY
ou ALL
vous devrez probablement les exprimer sous forme de sous-requête ou de CTE sur un VALUES
liste avec un agrégat pour produire un seul résultat. Bien sûr, vous pouvez le faire si vous le souhaitez, mais je m'en tiendrai à ANY
.
Il y a une vraie mise en garde ici :sur les anciennes versions de Pg, si vous écrivez ANY( SELECT ... )
, vous serez presque certainement mieux loti en termes de performances avec EXISTS (SELECT 1 FROM ... WHERE ...)
. Si vous êtes sur une version où l'optimiseur transformera ANY (...)
dans une jointure, vous n'avez pas à vous inquiéter. En cas de doute, cochez EXPLAIN
sortie.