Cara menggunakan ANY dan bukannya IN dalam klausa WHERE
Andaikan anda mempunyai pertanyaan seperti MyModel.where(id: ids)
dalam Rails yang menjana SQL menggunakan IN yang mengandungi senarai ID:
<code class="language-sql">SELECT "my_models".* FROM "my_models" WHERE "my_models".`"id"` IN (1, 28, 7, 8, 12)</code>
Untuk menggunakan APA-APA dan bukannya IN anda boleh mencuba:
<code class="language-ruby">MyModel.where("id = ANY(VALUES(#{ids.join '),('}))")</code>
Walau bagaimanapun, apabila tatasusunan ids
kosong, pendekatan ini gagal dan mengakibatkan ralat sintaks SQL.
Fahami DALAM dan APA-APA
IN dan ANY ungkapan mempunyai dua bentuk:
expression IN (subquery)
expression IN (value [, ...])
atau expression ANY (array expression)
Untuk bentuk kedua, IN menjangkakan senarai nilai, manakala ANY menjangkakan tatasusunan.
Bila hendak menggunakan ANY dan IN
ANY ialah pilihan yang lebih umum yang boleh digunakan dengan mana-mana operator yang mengembalikan nilai boolean. IN ialah kes khas ANY.
Dari segi prestasi, ANY tidak pernah lebih pantas daripada = ANY
dan = ANY
tidak lebih pantas daripada IN. Pilihan harus berdasarkan kemudahan.
Jika ID datang daripada pangkalan data, adalah lebih cekap untuk menggunakan subquery atau JOIN. Untuk prestasi terbaik apabila menghantar senarai panjang nilai daripada klien, pertimbangkan untuk menggunakan tatasusunan, unnest()
atau ungkapan VALUES.
= Sintaks MANA-MANA
Postgres menerima bentuk ungkapan tatasusunan berikut:
ARRAY[1,2,3]
{1,2,3}
Untuk mengelakkan penukaran jenis, hantar tatasusunan secara eksplisit: ARRAY[1,2,3]::numeric[]
.
Bagaimana untuk menghantar tatasusunan daripada Ruby
Anggap id
ialah integer:
<code class="language-ruby">MyModel.where('id = ANY(ARRAY[?]::int[])', ids.map { |i| i})</code>
Atas ialah kandungan terperinci Bilakah Saya Harus Menggunakan MANA-MANA Daripada IN dalam Klausa WHERE?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!