Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

SQL:precisamos de palavras-chave ANY/SOME e ALL?


Acho que ANY e ALL são muito úteis quando você não está apenas testando igualdade ou desigualdade. Considerar
'blah' LIKE ANY (ARRAY['%lah', '%fah', '%dah']);

como usei minha resposta para esta pergunta .

ANY , ALL e suas negações podem simplificar bastante o código que, de outra forma, exigiria subconsultas ou CTEs não triviais, e são significativamente subutilizadas na minha opinião.

Considere que ANY funcionará com qualquer operador. É muito útil com LIKE e ~ , mas funcionará com tsquery, testes de associação de matriz, testes de chave hstore e muito mais.
'a => 1, e => 2'::hstore ? ANY (ARRAY['a', 'b', 'c', 'd'])

ou:
'a => 1, b => 2'::hstore ? ALL (ARRAY['a', 'b'])

Sem ANY ou ALL você provavelmente teria que expressá-los como uma subconsulta ou CTE sobre um VALUES list com um agregado para produzir um único resultado. Claro, você pode fazer isso se quiser, mas vou ficar com ANY .

Há uma advertência real aqui:em versões mais antigas do Pg, se você estiver escrevendo ANY( SELECT ... ) , você certamente ficará melhor em termos de desempenho com EXISTS (SELECT 1 FROM ... WHERE ...) . Se você estiver em uma versão em que o otimizador ativará ANY (...) em uma junção, então você não precisa se preocupar. Em caso de dúvida, verifique EXPLAIN resultado.