Я только что разработал для этого специфичную для PostgreSQL опцию. Это что-то вроде хака, и оно имеет свои плюсы и минусы и ограничения, но, похоже, работает и не ограничивается конкретным языком разработки, платформой или драйвером PG.
Конечно, хитрость заключается в том, чтобы найти способ передать коллекцию значений произвольной длины в качестве одного параметра и сделать так, чтобы БД распознал его как несколько значений. Решение, с которым я работаю, состоит в том, чтобы создать строку с разделителями из значений в коллекции, передать эту строку в качестве единственного параметра и использовать 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, применяются ограничения и исключения, без явных или подразумеваемых гарантий.
Но это работает.