sql >> Databáze >  >> RDS >> PostgreSQL

JavaScript (Postgres DB) - Jak používat připravený příkaz s polem jako parametrem v klauzuli WHERE IN ( )

Je to popsáno v FAQ 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

Jak vytvořím dotaz WHERE foo IN (...), abych našel řádky odpovídající poli hodnot? node-postgres podporuje mapování jednoduchých polí JavaScriptu na pole PostgreSQL, takže jej ve většině případů můžete předat jako jakékoli jiné parametr.

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

Všimněte si, že =ANY je další způsob, jak zapsat IN (...), ale na rozdíl od IN (...) bude fungovat tak, jak byste očekávali, když předáte pole jako parametr dotazu.

Pokud znáte délku pole předem, můžete jej sloučit do seznamu IN:

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

... ale má to malou výhodu, když =ANY pracuje s polem JavaScript.

Pokud používáte starou verzi node-postgres nebo potřebujete vytvořit složitější pole PostgreSQL (pole složených typů atd.), se kterými si node-postgres neporadí, můžete vygenerovat literál pole pomocí dynamického SQL, ale při tom buďte extrémně opatrní na SQL injection. Následující přístup je bezpečný, protože generuje řetězec dotazu s parametry dotazu a sloučeným seznamem parametrů, takže stále používáte podporu ovladače pro parametrizované dotazy („připravené příkazy“) k ochraně před vložením 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, ...);

Doufám, že to pomůže, protože Google to nenašel




  1. Přehled nástrojů pro plánování úloh pro PostgreSQL

  2. Nejlepší DBaaS řešení pro PostgreSQL

  3. 7 způsobů, jak vrátit všechny tabulky s primárním klíčem na SQL Server

  4. Jak získat hodnotu z posledního vloženého řádku?