sql >> Databasteknik >  >> RDS >> PostgreSQL

JavaScript (Postgres DB) - Hur man använder en förberedd sats med en array som parameter i WHERE IN ( )-satsen

Det beskrivs i FAQ för node-postgres https://github.com/brianc/node-postgres/wiki/FAQ#11-how- gör-jag-bygga-en-var-foo-i-fråga-för-att-hitta-rader-matchar-en-array-of-values

Hur bygger jag en WHERE foo IN (...)-fråga för att hitta rader som matchar en array av värden? node-postgres stöder mappning av enkla JavaScript-arrayer till PostgreSQL-arrayer, så i de flesta fall kan du bara skicka den som alla andra parameter.

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

Observera att =ANY är ett annat sätt att skriva IN (...), men till skillnad från IN (...) kommer det att fungera som du förväntar dig när du skickar en array som en frågeparameter.

Om du vet längden på arrayen i förväg kan du platta till den till en IN-lista:

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

... men det är liten fördel när =ANY fungerar med en JavaScript-array.

Om du använder en gammal version av node-postgres eller om du behöver skapa mer komplexa PostgreSQL-arrayer (arrayer av sammansatta typer, etc) som node-postgres inte klarar av, kan du generera en array literal med dynamisk SQL, men var extremt försiktig med SQL-injektion när du gör detta. Följande tillvägagångssätt är säkert eftersom det genererar en frågesträng med frågeparametrar och en tillplattad parameterlista, så du använder fortfarande drivrutinens stöd för parametriserade frågor ("prepared statements") för att skydda mot SQL-injektion:

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

Hoppas det hjälper eftersom google inte hittar detta




  1. SQL-frågan visar inte det första resultatet?

  2. Genererar sql insert i för Oracle

  3. MYSQL INNER JOIN för att få 3 typer av resultat

  4. pdo-uppdateringssatsen med hjälp av concat fungerar inte