PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

JavaScript (Postgres DB) – Verwendung einer vorbereiteten Anweisung mit einem Array als Parameter in der WHERE IN ()-Klausel

Es ist in der FAQ von node-postgres beschrieben https://github.com/brianc/node-postgres/wiki/FAQ#11-how- do-i-build-a-where-foo-in--query-to-find-rows-matching-an-array-of-values

Wie erstelle ich eine WHERE foo IN (...)-Abfrage, um Zeilen zu finden, die mit einem Array von Werten übereinstimmen?node-postgres unterstützt die Zuordnung einfacher JavaScript-Arrays zu PostgreSQL-Arrays, sodass Sie es in den meisten Fällen einfach wie jedes andere übergeben können Parameter.

client.query("SELECT * FROM stooges WHERE name = ANY ($1)", [ ['larry', 'curly', 'moe'] ], ...);

Beachten Sie, dass =ANY eine andere Möglichkeit ist, IN (...) zu schreiben, aber im Gegensatz zu IN (...) funktioniert es wie erwartet, wenn Sie ein Array als Abfrageparameter übergeben.

Wenn Sie die Länge des Arrays im Voraus kennen, können Sie es auf eine IN-Liste reduzieren:

// passing a flat array of values will work:
client.query("SELECT * FROM stooges WHERE name IN ($1, $2, $3)", ['larry', 'curly', 'moe'], ...);

... aber es bringt wenig, wenn =ANY mit einem JavaScript-Array arbeitet.

Wenn Sie eine alte Version von node-postgres verwenden oder komplexere PostgreSQL-Arrays (Arrays zusammengesetzter Typen usw.) erstellen müssen, mit denen node-postgres nicht fertig wird, können Sie ein Array-Literal mit dynamischem SQL generieren, aber Seien Sie dabei äußerst vorsichtig mit der SQL-Einschleusung. Der folgende Ansatz ist sicher, da er eine Abfragezeichenfolge mit Abfrageparametern und einer vereinfachten Parameterliste generiert, sodass Sie immer noch die Unterstützung des Treibers für parametrisierte Abfragen ("vorbereitete Anweisungen") verwenden, um sich vor SQL-Injection zu schützen:

var stooge_names = ['larry', 'curly', 'moe'];
var offset = 1;
var placeholders = stooge_names.map(function(name,i) { 
    return '$'+(i+offset); 
}).join(',');
client.query("SELECT * FROM stooges WHERE name IN ("+placeholders+")", stooge_names, ...);

Ich hoffe, das hilft, da Google dies nicht findet