Encuentro que ANY y ALL son muy útiles cuando no solo estás probando igualdad o desigualdad. Considere
'blah' LIKE ANY (ARRAY['%lah', '%fah', '%dah']);
como usé mi respuesta a esta pregunta .
ANY
, ALL
y sus negaciones pueden simplificar en gran medida el código que, de lo contrario, requeriría subconsultas o CTE no triviales, y en mi opinión, están significativamente infrautilizados.
Considere que ANY
funcionará con cualquier operador. Es muy útil con LIKE
y ~
, pero funcionará con tsquery, pruebas de membresía de matriz, pruebas de clave hstore y más.
'a => 1, e => 2'::hstore ? ANY (ARRAY['a', 'b', 'c', 'd'])
o:
'a => 1, b => 2'::hstore ? ALL (ARRAY['a', 'b'])
Sin ANY
o ALL
probablemente tendría que expresarlos como una subconsulta o CTE sobre un VALUES
lista con un agregado para producir un único resultado. Claro, puedes hacerlo si quieres, pero me ceñiré a ANY
.
Aquí hay una advertencia real:en versiones anteriores de Pg, si está escribiendo ANY( SELECT ... )
, es casi seguro que estará mejor en términos de rendimiento con EXISTS (SELECT 1 FROM ... WHERE ...)
. Si está en una versión en la que el optimizador activará ANY (...)
en una unión, entonces no necesita preocuparse. En caso de duda, consulte EXPLAIN
salida.