Je viens de trouver une option spécifique à PostgreSQL pour cela. C'est un peu un hack, et il a ses propres avantages, inconvénients et limitations, mais il semble fonctionner et n'est pas limité à un langage de développement, une plate-forme ou un pilote PG spécifique.
L'astuce est bien sûr de trouver un moyen de passer une collection de valeurs de longueur arbitraire en tant que paramètre unique, et de faire en sorte que la base de données la reconnaisse comme plusieurs valeurs. La solution que je travaille est de construire une chaîne délimitée à partir des valeurs de la collection, de passer cette chaîne en tant que paramètre unique et d'utiliser string_to_array () avec le casting requis pour que PostgreSQL l'utilise correctement.
Donc, si vous voulez rechercher "foo", "blah" et "abc", vous pouvez les concaténer ensemble dans une seule chaîne comme: "foo, blah, abc". Voici le SQL simple:
select column from table
where search_column = any (string_to_array('foo,blah,abc', ',')::text[]);
Vous changeriez évidemment la distribution explicite en ce que vous vouliez que votre tableau de valeurs résultant soit - int, texte, uuid, etc. Et parce que la fonction prend une seule valeur de chaîne (ou deux je suppose, si vous voulez personnaliser le délimiteur ainsi), vous pouvez le passer comme paramètre dans une instruction préparée:
select column from table
where search_column = any (string_to_array($1, ',')::text[]);
C'est même assez flexible pour supporter des choses comme les comparaisons LIKE:
select column from table
where search_column like any (string_to_array('foo%,blah%,abc%', ',')::text[]);
Encore une fois, il ne fait aucun doute que c'est un hack, mais cela fonctionne et vous permet toujours d'utiliser des instructions préparées précompilées qui prennent * ahem * des paramètres discrets , avec les avantages de sécurité et (peut-être) de performance qui l'accompagnent. Est-il conseillé et réellement performant? Naturellement, cela dépend, car vous avez une analyse de chaîne et éventuellement un cast avant que votre requête ne s'exécute. Si vous vous attendez à envoyer trois, cinq, quelques dizaines de valeurs, bien sûr, c'est très bien. Quelques milliers? Ouais, peut-être pas tellement. YMMV, des limitations et exclusions s'appliquent, aucune garantie expresse ou implicite.
Mais ça marche.