Я щойно розробив для цього варіант PostgreSQL. Це трохи хак, і він має свої плюси і мінуси та обмеження, але він, здається, працює і не обмежується певною мовою розробки, платформи чи PG.
Хитрість, звичайно, полягає в тому, щоб знайти спосіб передати довільну довжину колекції значень як єдиний параметр і дозволити db розпізнати його як кілька значень. Я працюю над рішенням - побудувати розділену рядок зі значень колекції, передавати її як єдиний параметр і використовувати string_to_array () з необхідним кастингом для PostgreSQL, щоб правильно її використовувати.
Тож якщо ви хочете шукати "foo", "blah" та "abc", ви можете об'єднати їх в один рядок як: "foo, blah, abc". Ось прямий SQL:
select column from table
where search_column = any (string_to_array('foo,blah,abc', ',')::text[]);
Ви, очевидно, змінили б чіткий вигляд на те, що хотіли б, щоб ваш результуючий масив був - int, text, uuid тощо. І тому, що функція приймає значення одного рядка (я думаю, або два, якщо ви хочете налаштувати роздільник) також), ви можете передати його як параметр у підготовленому операторі:
select column from table
where search_column = any (string_to_array($1, ',')::text[]);
Це навіть досить гнучко, щоб підтримувати такі речі, як порівняння LIKE:
select column from table
where search_column like any (string_to_array('foo%,blah%,abc%', ',')::text[]);
Знову ж таки, без сумніву, це хак, але він працює і дозволяє все-таки використовувати заздалегідь складені підготовлені заяви, які приймають * ах * дискретні параметри, із супутніми безпеками та (можливо) перевагами для продуктивності. Це доцільно і справді виконати? Звичайно, це залежить, оскільки у вас розбір рядків і можливо кастинг триває до того, як ваш запит навіть запуститься. Якщо ви розраховуєте надіслати три, п'ять, кілька десятків значень, звичайно, це, мабуть, добре. Кілька тисяч? Так, може, не так вже й багато. YMMV, обмеження та виключення застосовуються, жодних явних та явних гарантій.
Але це працює.