Jeg finder ALT og ALT for at være meget nyttigt, når du ikke bare tester lighed eller ulighed. Overvej
'blah' LIKE ANY (ARRAY['%lah', '%fah', '%dah']);
som brugte mit svar på dette spørgsmål .
ANY
, ALL
og deres negationer kan i høj grad forenkle kode, der ellers ville kræve ikke-trivielle underforespørgsler eller CTE'er, og de er betydeligt underudnyttede efter min mening.
Overvej at ANY
vil fungere med enhver operatør. Det er meget praktisk med LIKE
og ~
, men vil arbejde med tsquery, array-medlemskabstest, hstore-nøgletest og mere.
'a => 1, e => 2'::hstore ? ANY (ARRAY['a', 'b', 'c', 'd'])
eller:
'a => 1, b => 2'::hstore ? ALL (ARRAY['a', 'b'])
Uden ANY
eller ALL
du skal sandsynligvis udtrykke dem som en underforespørgsel eller CTE over en VALUES
liste med et aggregat for at producere et enkelt resultat. Selvfølgelig kan du gøre det, hvis du vil, men jeg holder mig til ANY
.
Der er en rigtig advarsel her:På ældre Pg-versioner, hvis du skriver ANY( SELECT ... )
, vil du næsten helt sikkert være bedre stillet med hensyn til ydeevne med EXISTS (SELECT 1 FROM ... WHERE ...)
. Hvis du er på en version, hvor optimeringsværktøjet vil slå ANY (...)
til at deltage, så behøver du ikke bekymre dig. Hvis du er i tvivl, så tjek EXPLAIN
output.