PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

JavaScript (Postgres DB) - Comment utiliser une instruction préparée avec un tableau comme paramètre dans la clause WHERE IN ( )

Il est décrit dans la FAQ de node-postgres 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

Comment créer une requête WHERE foo IN (...) pour trouver des lignes correspondant à un tableau de valeurs ? node-postgres prend en charge le mappage de tableaux JavaScript simples vers des tableaux PostgreSQL, donc dans la plupart des cas, vous pouvez simplement le passer comme n'importe quel autre paramètre.

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

Notez que =ANY est une autre façon d'écrire IN (...), mais contrairement à IN (...), cela fonctionnera comme prévu lorsque vous transmettez un tableau en tant que paramètre de requête.

Si vous connaissez la longueur du tableau à l'avance, vous pouvez l'aplatir en une liste IN :

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

... mais il y a peu d'avantages lorsque =ANY fonctionne avec un tableau JavaScript.

Si vous êtes sur une ancienne version de node-postgres ou si vous avez besoin de créer des tableaux PostgreSQL plus complexes (tableaux de types composites, etc.) que node-postgres ne gère pas, vous pouvez générer un littéral de tableau avec SQL dynamique, mais faites extrêmement attention à l'injection SQL lorsque vous faites cela. L'approche suivante est sûre car elle génère une chaîne de requête avec des paramètres de requête et une liste de paramètres aplatie, de sorte que vous utilisez toujours la prise en charge du pilote pour les requêtes paramétrées ("instructions préparées") pour vous protéger contre l'injection SQL :

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, ...);

J'espère que cela aide puisque Google ne parvient pas à trouver cela