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.