Apa perbedaan antara operator IN
dan ANY
di PostgreSQL?
Mekanisme kerja keduanya tampaknya sama. Adakah yang bisa menjelaskan ini dengan sebuah contoh?
Apa perbedaan antara operator IN
dan ANY
di PostgreSQL?
Mekanisme kerja keduanya tampaknya sama. Adakah yang bisa menjelaskan ini dengan sebuah contoh?
Jawaban:
(Bukan IN
juga ANY
"operator". Sebuah "konstruksi" atau "elemen sintaks".)
Logikanya , mengutip manual :
IN
setara dengan= ANY
.
Tapi ada dua varian sintaks dari IN
dan dua varian ANY
. Rincian:
IN
mengambil satu set sama dengan = ANY
mengambil satu set , seperti yang ditunjukkan di sini:
Namun varian kedua masing-masing tidak setara dengan yang lain. Varian kedua dari ANY
konstruksi tersebut mengambil sebuah larik (harus berupa jenis larik sebenarnya), sedangkan varian kedua dari IN
mengambil daftar nilai yang dipisahkan koma . Ini mengarah pada batasan yang berbeda dalam meneruskan nilai dan juga dapat mengarah ke rencana kueri yang berbeda dalam kasus khusus:
=any()
tetapi digunakan denganin
ANY
lebih serbagunaThe ANY
membangun jauh lebih fleksibel, karena dapat dikombinasikan dengan berbagai operator, tidak hanya =
. Contoh:
SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');
Untuk sejumlah besar nilai, memberikan satu set skala yang lebih baik untuk masing-masing:
Terkait:
"Temukan baris di mana id
dalam larik yang diberikan":
SELECT * FROM tbl WHERE id = ANY (ARRAY[1, 2]);
Pembalikan: "Temukan baris id
yang tidak ada dalam array":
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 literal array . Tipe data dapat diturunkan dari konteks dengan jelas. Lain, pemeran eksplisit mungkin diperlukan, seperti '{1,2}'::int[]
.
Baris dengan id IS NULL
tidak lulus salah satu ekspresi ini. Untuk memasukkan NULL
nilai - nilai tambahan:
SELECT * FROM tbl WHERE (id = ANY ('{1, 2}')) IS NOT TRUE;
SELECT * from mytable where id in (1, 2, 3)
akan selalu menghasilkan baris yang sama dengan SELECT * from mytable where id = ANY('{1, 2, 3}')
, meskipun mungkin memiliki rencana kueri yang berbeda.
ANY
tidak bisa digabungkan dengan !=
operator. Saya tidak berpikir itu didokumentasikan, tetapi select * from foo where id != ANY (ARRAY[1, 2])
tidak sama dengan select * from foo where id NOT IN (1, 2)
. Di sisi lain, select * from foo where NOT (id = ANY (ARRAY[1, 2]))
berfungsi seperti yang diharapkan.
ANY
dapat digabungkan dengan !=
operator. Tapi ada lebih banyak lagi mengenai hal tersebut. Saya menambahkan bab di atas. (Perhatikan bahwa <>
operator dalam SQL standar - meskipun !=
diterima juga di Postgres.)
NULL
nilai? Apakah akan WHERE id = ANY (ARRAY[1, 2]) OR id IS NULL;
berhasil dengan baik?
(id = ...) IS NOT TRUE
berfungsi karena id = ...
hanya mengevaluasi TRUE
jika ada kecocokan aktual. Hasil FALSE
atau NULL
lulus ujian kami. Lihat: stackoverflow.com/a/23767625/939860 . Ekspresi yang Anda tambahkan menguji sesuatu yang lain. Ini akan setaraWHERE id <> ALL (ARRAY[1, 2]) OR id IS NULL;
Ada dua poin yang jelas, serta poin-poin dalam jawaban lainnya:
Mereka sama persis saat menggunakan sub queri:
SELECT * FROM table
WHERE column IN(subquery);
SELECT * FROM table
WHERE column = ANY(subquery);
Di samping itu:
Hanya IN
operator yang mengizinkan daftar sederhana:
SELECT * FROM table
WHERE column IN(… , … , …);
Menganggap mereka persis sama telah membuat saya beberapa kali lupa bahwa ANY
tidak bekerja dengan daftar.