Acabei de elaborar uma opção específica do PostgreSQL para isso. É um pouco complicado, e vem com seus próprios prós, contras e limitações, mas parece funcionar e não está limitado a uma linguagem de desenvolvimento, plataforma ou driver PG específico.
O truque, é claro, é encontrar uma maneira de passar uma coleção arbitrária de valores como um único parâmetro e fazer com que o banco de dados reconheça isso como vários valores. A solução que eu estou trabalhando é construir uma string delimitada a partir dos valores da coleção, passar essa string como um único parâmetro e usar string_to_array () com a conversão necessária para o PostgreSQL utilizá-la corretamente.
Portanto, se você deseja procurar por "foo", "blá" e "abc", concatená-los juntos em uma única string como: 'foo, blá, abc'. Aqui está o SQL direto:
select column from table
where search_column = any (string_to_array('foo,blah,abc', ',')::text[]);
Você obviamente alteraria a conversão explícita para o que você deseja que sua matriz de valores resultante seja - int, texto, uuid etc. também), você pode passá-lo como parâmetro em uma instrução preparada:
select column from table
where search_column = any (string_to_array($1, ',')::text[]);
Isso é flexível o suficiente para suportar coisas como comparações LIKE:
select column from table
where search_column like any (string_to_array('foo%,blah%,abc%', ',')::text[]);
Novamente, sem dúvida é um hack, mas funciona e permite que você ainda use instruções preparadas pré-compiladas que usam parâmetros distintos * ahem * , com os benefícios de segurança e (talvez) desempenho associados. É aconselhável e realmente tem desempenho? Naturalmente, isso depende, pois você tem a análise de string e a transmissão possível antes mesmo de sua consulta ser executada. Se você espera enviar três, cinco, algumas dezenas de valores, claro, provavelmente tudo bem. Alguns milhares? Sim, talvez não tanto. YMMV, limitações e exclusões se aplicam, nenhuma garantia expressa ou implícita.
Mas funciona.