Ho appena elaborato un'opzione specifica PostgreSQL per questo. È un po 'un hack e viene fornito con i suoi pro, contro e limiti, ma sembra funzionare e non si limita a un linguaggio di sviluppo specifico, una piattaforma o un driver PG.
Il trucco ovviamente è trovare un modo per passare una raccolta di valori di lunghezza arbitraria come singolo parametro e fare in modo che il db lo riconosca come valori multipli. La soluzione che sto lavorando è quella di costruire una stringa delimitata dai valori nella raccolta, passare quella stringa come singolo parametro e usare string_to_array () con il cast necessario per PostgreSQL per usarlo correttamente.
Quindi, se si desidera cercare "foo", "blah" e "abc", è possibile concatenarli insieme in un'unica stringa come: "foo, blah, abc". Ecco il semplice SQL:
select column from table
where search_column = any (string_to_array('foo,blah,abc', ',')::text[]);
Ovviamente cambieresti il cast esplicito in qualunque cosa tu volessi che fosse la tua matrice di valori risultante - int, text, uuid, ecc. E poiché la funzione sta prendendo un singolo valore di stringa (o due suppongo, se vuoi personalizzare il delimitatore anche), puoi passarlo come parametro in un'istruzione preparata:
select column from table
where search_column = any (string_to_array($1, ',')::text[]);
Questo è persino abbastanza flessibile da supportare cose come i confronti LIKE:
select column from table
where search_column like any (string_to_array('foo%,blah%,abc%', ',')::text[]);
Ancora una volta, non c'è dubbio che sia un hack, ma funziona e consente di utilizzare ancora istruzioni preparate precompilate che accettano parametri * ahem * discreti, con i relativi vantaggi di sicurezza e (forse) prestazionali. È consigliabile e realmente performante? Naturalmente, dipende dal fatto che hai l'analisi delle stringhe e che il casting potrebbe essere in corso prima ancora che la tua query venga eseguita. Se ti aspetti di inviare tre, cinque, alcune decine di valori, sicuramente va bene. Qualche migliaio? Sì, forse non così tanto. Si applicano YMMV, limitazioni ed esclusioni, nessuna garanzia espressa o implicita.
Ma funziona