Właśnie opracowałem dla tego opcję specyficzną dla PostgreSQL. Jest to trochę hack i ma swoje zalety i wady oraz ograniczenia, ale wydaje się, że działa i nie ogranicza się do konkretnego języka programowania, platformy lub sterownika PG.
Sztuczka polega oczywiście na znalezieniu sposobu na przekazanie zbioru wartości o dowolnej długości jako jednego parametru i spowodowanie, aby db rozpoznał je jako wiele wartości. Rozwiązaniem, które pracuję, jest skonstruowanie łańcucha rozdzielanego z wartości w kolekcji, przekazanie go jako jednego parametru i użycie string_to_array () z wymaganym rzutowaniem dla PostgreSQL, aby właściwie z niego skorzystać.
Więc jeśli chcesz wyszukać „foo”, „bla” i „abc”, możesz połączyć je razem w jeden ciąg znaków: „foo, bla, abc”. Oto prosty SQL:
select column from table
where search_column = any (string_to_array('foo,blah,abc', ',')::text[]);
Oczywiście zmieniłbyś jawną rzutowanie na cokolwiek, co chcesz, aby wynikowa tablica wartości była - int, tekst, uuid itp. A ponieważ funkcja przyjmuje jedną wartość ciągu (lub dwie, jak sądzę, jeśli chcesz dostosować separator) również), możesz przekazać go jako parametr w przygotowanej instrukcji:
select column from table
where search_column = any (string_to_array($1, ',')::text[]);
Jest to nawet wystarczająco elastyczne, aby obsługiwać takie rzeczy jak porównania LIKE:
select column from table
where search_column like any (string_to_array('foo%,blah%,abc%', ',')::text[]);
Ponownie, bez wątpienia jest to hack, ale działa i pozwala nadal korzystać ze wstępnie skompilowanych przygotowanych instrukcji, które przyjmują * ahem * dyskretne parametry, z towarzyszącymi korzyściami bezpieczeństwa i (być może) wydajnością. Czy jest to wskazane i faktycznie skuteczne? Oczywiście to zależy, ponieważ parsowanie ciągów i być może przesyłanie odbywa się jeszcze przed uruchomieniem zapytania. Jeśli spodziewasz się wysłać trzy, pięć, kilkadziesiąt wartości, na pewno jest to w porządku. Kilka tysięcy? Tak, może nie tak bardzo. YMMV, obowiązują ograniczenia i wyłączenia, bez gwarancji wyraźnej lub dorozumianej.
Ale to działa.