Ich habe gerade eine PostgreSQL-spezifische Option dafür ausgearbeitet. Es ist ein bisschen ein Hack und hat seine eigenen Vor- und Nachteile und Einschränkungen, aber es scheint zu funktionieren und ist nicht auf eine bestimmte Entwicklungssprache, Plattform oder einen PG-Treiber beschränkt.
Der Trick ist natürlich, einen Weg zu finden, um eine beliebige Länge Sammlung von Werten als ein einzelner Parameter übergeben, und haben die DB erkennen es als mehrere Werte. Die Lösung, die ich habe, ist eine begrenzte Zeichenfolge aus den Werten in der Sammlung zu konstruieren, übergeben Sie diese Zeichenfolge als ein einzelner Parameter, und verwenden Sie string_to_array() mit der erforderlichen Casting für PostgreSQL, um richtig zu verwenden.
Wenn Sie also nach "foo", "blah" und "abc" suchen wollen, können Sie sie zu einer einzigen Zeichenkette verketten: 'foo,blah,abc'. Hier ist das direkte SQL:
select column from table
where search_column = any (string_to_array('foo,blah,abc', ',')::text[]);
Sie würden natürlich ändern Sie die explizite Cast zu was auch immer Sie wollten Ihre resultierende Wert-Array zu sein - int, Text, uuid, etc. Und da die Funktion einen einzelnen String-Wert annimmt (oder zwei, wenn Sie auch das Trennzeichen anpassen möchten), können Sie ihn als Parameter in einer vorbereiteten Anweisung übergeben:
select column from table
where search_column = any (string_to_array($1, ',')::text[]);
Dies ist sogar flexibel genug, um Dinge wie LIKE-Vergleiche zu unterstützen:
select column from table
where search_column like any (string_to_array('foo%,blah%,abc%', ',')::text[]);
Auch dies ist zweifellos ein Hack, aber er funktioniert und ermöglicht es Ihnen, vorkompilierte vorbereitete Anweisungen zu verwenden, die die *hust* diskrete Parameter, mit den damit einhergehenden Sicherheits- und (vielleicht) Leistungsvorteilen. Ist dies ratsam und tatsächlich leistungsfähig? Das kommt natürlich darauf an, denn bevor die Abfrage überhaupt ausgeführt wird, findet bereits ein String-Parsing und möglicherweise ein Casting statt. Wenn Sie drei, fünf oder ein paar Dutzend Werte übermitteln wollen, ist das wahrscheinlich in Ordnung. Ein paar Tausend? Ja, vielleicht nicht so sehr. YMMV, Einschränkungen und Ausschlüsse gelten, keine ausdrückliche oder stillschweigende Garantie.
Aber es funktioniert.