Bunun için PostgreSQL'e özel bir seçenek geliştirdim. Biraz hack ve kendi artıları, eksileri ve sınırlamaları ile birlikte geliyor, ancak işe yarıyor gibi görünüyor ve belirli bir geliştirme dili, platform veya PG sürücüsü ile sınırlı değil.
İşin püf noktası, keyfi bir uzunluk değerlerini tek bir parametre olarak geçirmenin bir yolunu bulmak ve db'nin birden çok değer olarak tanımasını sağlamaktır. Çalıştığım çözüm, koleksiyondaki değerlerden sınırlandırılmış bir dize oluşturmak, bu dizeyi tek bir parametre olarak iletmek ve PostgreSQL için düzgün bir şekilde kullanmak için gerekli döküm ile string_to_array () kullanmaktır.
Dolayısıyla, "foo", "blah" ve "abc" kelimelerini aramak istiyorsanız, bunları "foo, blah, abc" gibi tek bir dizede birleştirebilirsiniz. İşte düz SQL:
select column from table
where search_column = any (string_to_array('foo,blah,abc', ',')::text[]);
Açıkça ortaya çıkan değer dizinizin olmasını istediğiniz her şeye değiştirirsiniz - int, metin, uuid, vb. Ve işlev tek bir dize değeri alıyorsa (veya ayırıcıyı özelleştirmek istiyorsanız iki ayrıca) hazırlanmış bir ifadede parametre olarak iletebilirsiniz:
select column from table
where search_column = any (string_to_array($1, ',')::text[]);
Bu, LIKE karşılaştırmaları gibi şeyleri destekleyecek kadar esnektir:
select column from table
where search_column like any (string_to_array('foo%,blah%,abc%', ',')::text[]);
Yine, hiçbir soru bu bir hack, ama işe yarıyor ve beraberinde gelen güvenlik ve (belki) performans faydaları ile * ahem * ayrık parametreler alan önceden derlenmiş hazırlanmış ifadeler kullanmanızı sağlar. Tavsiye edilir ve gerçekte performans gösterir mi? Doğal olarak, sorgunuz çalışmaya başlamadan önce dize ayrıştırma ve döküm işlemi yaptığınıza göre değişir. Üç, beş, birkaç düzine değer göndermeyi bekliyorsanız, muhtemelen iyi olabilir. Birkaç bin mi? Evet, belki o kadar da değil. YMMV, sınırlamalar ve istisnalar geçerlidir, hiçbir açık veya zımni garanti verilmez.
Ama işe yarıyor.