Mysql
 sql >> Base de données >  >> RDS >> Mysql

SQL :avons-nous besoin de ANY/SOME et ALL mots-clés ?

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.