(Baik IN
atau ANY
adalah "operator". Sebuah "konstruksi" atau "elemen sintaks".)
Secara logis , mengutip manual:
IN
setara dengan= ANY
.
Tapi ada dua varian sintaks dari IN
dan dua varian ANY
. Detail:
- Bagaimana cara menggunakan ANY daripada IN dalam klausa WHERE dengan Rails?
IN
mengambil set setara dengan = ANY
mengambil set , seperti yang ditunjukkan di sini:
- postgreSQL - dalam vs apa pun
Namun varian kedua masing-masing tidak setara dengan yang lain. Varian kedua dari ANY
konstruksi membutuhkan array (harus merupakan tipe array yang sebenarnya), sedangkan varian kedua dari IN
mengambil daftar nilai yang dipisahkan koma . Hal ini menyebabkan batasan yang berbeda dalam meneruskan nilai dan dapat juga mengarah ke rencana kueri yang berbeda dalam kasus khusus:
- Indeks tidak digunakan dengan
=any()
tetapi digunakan denganin
- Meneruskan beberapa set atau larik nilai ke suatu fungsi
- Bagaimana cara mencocokkan elemen dalam array tipe komposit?
ANY
lebih serbaguna
ANY
konstruksi jauh lebih fleksibel, karena dapat dikombinasikan dengan berbagai operator, bukan hanya =
. Contoh:
SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');
Untuk sejumlah besar nilai, berikan set skala lebih baik untuk masing-masing:
- Mengoptimalkan kueri Postgres dengan IN besar
Terkait:
- Dapatkah PostgreSQL mengindeks kolom array?
Pembalikan / kebalikan / pengecualian
"Temukan baris di mana id
ada dalam larik yang diberikan":
SELECT * FROM tbl WHERE id = ANY (ARRAY[1, 2]);
Inversi:"Temukan baris di mana id
adalah tidak dalam larik":
SELECT * FROM tbl WHERE id <> ALL (ARRAY[1, 2]);
SELECT * FROM tbl WHERE id <> ALL ('{1, 2}'); -- equivalent array literal
SELECT * FROM tbl WHERE NOT (id = ANY ('{1, 2}'));
Ketiganya setara. Yang pertama dengan konstruktor array, dua lainnya dengan array literal. Tipe data dapat diturunkan dari konteks dengan jelas. Jika tidak, pemeran eksplisit mungkin diperlukan, seperti '{1,2}'::int[]
.
Baris dengan id IS NULL
tidak lulus salah satu dari ekspresi ini. Untuk memasukkan NULL
nilai tambahan:
SELECT * FROM tbl WHERE (id = ANY ('{1, 2}')) IS NOT TRUE;