Saya baru saja mengerjakan opsi khusus PostgreSQL untuk ini. Ini sedikit peretasan, dan dilengkapi dengan pro dan kontra dan batasannya sendiri, tetapi tampaknya berfungsi dan tidak terbatas pada bahasa pengembangan, platform, atau driver PG tertentu.
Triknya tentu saja adalah menemukan cara untuk melewatkan koleksi panjang nilai yang berubah-ubah sebagai parameter tunggal, dan minta db mengenalinya sebagai beberapa nilai. Solusi yang saya kerjakan adalah membangun string yang dibatasi dari nilai-nilai dalam koleksi, meneruskan string itu sebagai parameter tunggal, dan menggunakan string_to_array () dengan casting yang diperlukan untuk PostgreSQL untuk memanfaatkannya dengan benar.
Jadi jika Anda ingin mencari "foo", "bla", dan "abc", Anda dapat menyatukannya menjadi satu string sebagai: 'foo, blah, abc'. Inilah SQL lurus:
select column from table
where search_column = any (string_to_array('foo,blah,abc', ',')::text[]);
Anda jelas akan mengubah pemeran eksplisit menjadi apa pun yang Anda inginkan menjadi array nilai yang dihasilkan menjadi - int, teks, uuid, dll. Dan karena fungsinya mengambil nilai string tunggal (atau dua saya kira, jika Anda ingin menyesuaikan pembatas juga), Anda dapat meneruskannya sebagai parameter dalam pernyataan yang disiapkan:
select column from table
where search_column = any (string_to_array($1, ',')::text[]);
Ini bahkan cukup fleksibel untuk mendukung hal-hal seperti perbandingan SEPERTI:
select column from table
where search_column like any (string_to_array('foo%,blah%,abc%', ',')::text[]);
Sekali lagi, tidak diragukan lagi ini adalah peretasan, tetapi ini berfungsi dan memungkinkan Anda untuk tetap menggunakan pernyataan yang telah disiapkan sebelumnya yang mengambil parameter diskrit * ahem * , dengan keamanan yang menyertainya dan (mungkin) manfaat kinerja. Apakah disarankan dan benar-benar performant? Tentu saja, itu tergantung, karena Anda memiliki penguraian string dan kemungkinan casting berlangsung sebelum kueri Anda bahkan berjalan. Jika Anda mengharapkan untuk mengirim tiga, lima, beberapa lusin nilai, tentu, itu mungkin baik-baik saja. Beberapa ribu? Ya, mungkin tidak terlalu banyak. YMMV, batasan dan pengecualian berlaku, tidak ada jaminan tersurat maupun tersirat.
Tapi itu berhasil.