Uważam, że WSZYSTKIE i WSZYSTKIE są bardzo przydatne, gdy nie tylko testujesz równość lub nierówność. Rozważ
'blah' LIKE ANY (ARRAY['%lah', '%fah', '%dah']);
jak użyłem mojej odpowiedzi na to pytanie .
ANY
, ALL
a ich negacje mogą znacznie uprościć kod, który w przeciwnym razie wymagałby nietrywialnych podzapytań lub CTE, a moim zdaniem są one znacznie niedostatecznie wykorzystywane.
Weź pod uwagę, że ANY
będzie współpracować z każdym operatorem. Jest to bardzo przydatne z LIKE
i ~
, ale będzie działać z tsquery, testami członkostwa w tablicy, testami kluczy hstore i innymi.
'a => 1, e => 2'::hstore ? ANY (ARRAY['a', 'b', 'c', 'd'])
lub:
'a => 1, b => 2'::hstore ? ALL (ARRAY['a', 'b'])
Bez ANY
lub ALL
prawdopodobnie będziesz musiał wyrazić je jako podzapytanie lub CTE przez VALUES
lista z agregatem, aby uzyskać pojedynczy wynik. Jasne, możesz to zrobić, jeśli chcesz, ale pozostanę przy ANY
.
Jest jedno prawdziwe zastrzeżenie:w starszych wersjach Pg, jeśli piszesz ANY( SELECT ... )
, prawie na pewno poprawi się wydajność dzięki EXISTS (SELECT 1 FROM ... WHERE ...)
. Jeśli korzystasz z wersji, w której optymalizator włączy ANY (...)
do przyłączenia, to nie musisz się martwić. W razie wątpliwości sprawdź EXPLAIN
wyjście.