PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

JavaScript (Postgres DB) - Come utilizzare un'istruzione preparata con un array come parametro nella clausola WHERE IN ( )

È descritto nelle FAQ di node-postgres https://github.com/brianc/node-postgres/wiki/FAQ#11-how- do-i-build-a-where-foo-in-query-per-trovare-righe-corrispondenti-a-una-matrice-di-valori

Come faccio a creare una query WHERE foo IN (...) per trovare righe che corrispondono a un array di valori?node-postgres supporta la mappatura di semplici array JavaScript su array PostgreSQL, quindi nella maggior parte dei casi puoi semplicemente passarlo come qualsiasi altro parametro.

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

Nota che =ANY è un altro modo per scrivere IN (...), ma a differenza di IN (...) funzionerà come ti aspetteresti quando passi un array come parametro di query.

Se conosci la lunghezza dell'array in anticipo, puoi appiattirla in un elenco IN:

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

... ma c'è poco vantaggio quando =ANY funziona con un array JavaScript.

Se sei su una vecchia versione di node-postgres o hai bisogno di creare array PostgreSQL più complessi (array di tipi compositi, ecc.) che node-postgres non sta affrontando, puoi generare un array letterale con SQL dinamico, ma essere estremamente attenti all'iniezione SQL quando si esegue questa operazione. L'approccio seguente è sicuro perché genera una stringa di query con parametri di query e un elenco di parametri appiattito, quindi stai ancora utilizzando il supporto del driver per le query con parametri ("istruzioni preparate") per proteggerti dall'iniezione di 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, ...);

Spero che questo aiuti poiché Google non riesce a trovarlo