Намирам ANY и ALL за много полезен, когато не просто изпитвате равенство или неравенство. Помислете
'blah' LIKE ANY (ARRAY['%lah', '%fah', '%dah']);
като използва отговора ми на този въпрос .
ANY
, ALL
и техните отрицания могат значително да опростят кода, който иначе би изисквал нетривиални подзаявки или CTE, и според мен те се използват значително недостатъчно.
Помислете за това ANY
ще работи с всеки оператор. Много е удобно с LIKE
и ~
, но ще работи с tsquery, тестове за членство в масиви, тестове за ключове на hstore и др.
'a => 1, e => 2'::hstore ? ANY (ARRAY['a', 'b', 'c', 'd'])
или:
'a => 1, b => 2'::hstore ? ALL (ARRAY['a', 'b'])
Без ANY
или ALL
вероятно ще трябва да ги изразите като подзаявка или CTE върху VALUES
списък с агрегат за получаване на един резултат. Разбира се, можете да направите това, ако искате, но аз ще се придържам към ANY
.
Тук има едно истинско предупреждение:В по-стари версии на Pg, ако пишете ANY( SELECT ... )
, почти сигурно ще бъдете по-добри по отношение на производителността с EXISTS (SELECT 1 FROM ... WHERE ...)
. Ако използвате версия, при която оптимизаторът ще включи ANY (...)
в присъединяване, тогава няма нужда да се притеснявате. Ако се съмнявате, проверете EXPLAIN
изход.