ANY and ALL považuji za velmi užitečné, když netestujete pouze rovnost nebo nerovnost. Zvažte
'blah' LIKE ANY (ARRAY['%lah', '%fah', '%dah']);
jak byla použita moje odpověď na tuto otázku .
ANY
, ALL
a jejich negace mohou značně zjednodušit kód, který by jinak vyžadoval netriviální poddotazy nebo CTE, a podle mého názoru jsou výrazně málo využívány.
Zvažte, že ANY
bude spolupracovat s jakýmkoli operátorem. S LIKE
je to velmi praktické a ~
, ale bude fungovat s tsquery, testy členství v poli, testy klíčů hstore a další.
'a => 1, e => 2'::hstore ? ANY (ARRAY['a', 'b', 'c', 'd'])
nebo:
'a => 1, b => 2'::hstore ? ALL (ARRAY['a', 'b'])
Bez ANY
nebo ALL
pravděpodobně byste je museli vyjádřit jako dílčí dotaz nebo CTE přes VALUES
seznam s agregací pro vytvoření jediného výsledku. Jistě, můžete to udělat, pokud chcete, ale já se budu držet ANY
.
Je zde jedna skutečná námitka:Na starších verzích Pg, pokud píšete ANY( SELECT ... )
, téměř jistě na tom budete lépe z hlediska výkonu s EXISTS (SELECT 1 FROM ... WHERE ...)
. Pokud používáte verzi, kde se optimalizátor změní na ANY (...)
do připojení, pak se nemusíte bát. V případě pochybností zkontrolujte EXPLAIN
výstup.