Я только что разработал для этого специфичную для 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[]);
Опять же, без сомнения, это взлом, но он работает и позволяет вам по-прежнему использовать предварительно скомпилированные подготовленные операторы, которые принимают * ahem * дискретные параметры, с сопутствующими преимуществами безопасности и (возможно) производительности. Это целесообразно и действительно эффективно? Естественно, это зависит от того, как выполняется анализ строки и, возможно, приведение еще до того, как ваш запрос будет выполнен. Если вы ожидаете отправить три, пять, несколько десятков значений, конечно, это нормально. Несколько тысяч? Да, может быть, не так много. YMMV, ограничения и исключения применяются, никаких гарантий явных или подразумеваемых.
Но это работает.