Saya menemukan APAPUN dan SEMUA sangat berguna ketika Anda tidak hanya menguji kesetaraan atau ketidaksetaraan. Pertimbangkan
'blah' LIKE ANY (ARRAY['%lah', '%fah', '%dah']);
seperti yang digunakan jawaban saya untuk pertanyaan ini .
ANY
, ALL
dan penyangkalannya dapat sangat menyederhanakan kode yang jika tidak memerlukan subkueri atau CTE non-sepele, dan menurut saya mereka kurang digunakan secara signifikan.
Pertimbangkan bahwa ANY
akan bekerja dengan operator apa pun. Ini sangat berguna dengan LIKE
dan ~
, tetapi akan bekerja dengan tsquery, pengujian keanggotaan array, pengujian kunci hstore, dan banyak lagi.
'a => 1, e => 2'::hstore ? ANY (ARRAY['a', 'b', 'c', 'd'])
atau:
'a => 1, b => 2'::hstore ? ALL (ARRAY['a', 'b'])
Tanpa ANY
atau ALL
Anda mungkin harus mengekspresikannya sebagai subkueri atau CTE melalui VALUES
daftar dengan agregat untuk menghasilkan satu hasil. Tentu, Anda dapat melakukannya jika Anda mau, tetapi saya akan tetap menggunakan ANY
.
Ada satu peringatan nyata di sini:Pada versi Pg yang lebih lama, jika Anda menulis ANY( SELECT ... )
, Anda hampir pasti akan lebih baik dalam hal kinerja dengan EXISTS (SELECT 1 FROM ... WHERE ...)
. Jika Anda menggunakan versi di mana pengoptimal akan mengubah ANY (...)
untuk bergabung maka anda tidak perlu khawatir. Jika ragu, periksa EXPLAIN
keluaran.