Jag tycker ALLT och ALLT är väldigt användbart när du inte bara testar jämlikhet eller ojämlikhet. Överväg
'blah' LIKE ANY (ARRAY['%lah', '%fah', '%dah']);
som använde mitt svar på den här frågan .
ANY
, ALL
och deras negationer kan avsevärt förenkla kod som annars skulle kräva icke-triviala delfrågor eller CTE:er, och de är betydligt underutnyttjade enligt min mening.
Tänk på att ANY
fungerar med vilken operatör som helst. Det är väldigt praktiskt med LIKE
och ~
, men kommer att fungera med tsquery, array-medlemskapstester, hstore-nyckeltester och mer.
'a => 1, e => 2'::hstore ? ANY (ARRAY['a', 'b', 'c', 'd'])
eller:
'a => 1, b => 2'::hstore ? ALL (ARRAY['a', 'b'])
Utan ANY
eller ALL
du måste förmodligen uttrycka dem som en underfråga eller CTE över en VALUES
lista med ett aggregat för att producera ett enda resultat. Visst, du kan göra det om du vill, men jag håller mig till ANY
.
Det finns en riktig varning här:På äldre Pg-versioner, om du skriver ANY( SELECT ... )
, du kommer nästan säkert att få bättre prestanda med EXISTS (SELECT 1 FROM ... WHERE ...)
. Om du använder en version där optimeraren vänder ANY (...)
till en gå med så behöver du inte oroa dig. Om du är osäker, kontrollera EXPLAIN
utdata.