PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

JavaScript (Postgres DB) - Como usar uma instrução preparada com um array como parâmetro na cláusula WHERE IN ( )


Está descrito no FAQ do 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

Como eu construo uma consulta WHERE foo IN (...) para encontrar linhas que correspondam a um array de valores? node-postgres suporta o mapeamento de arrays JavaScript simples para arrays PostgreSQL, então na maioria dos casos você pode simplesmente passá-lo como qualquer outro parâmetro.
client.query("SELECT * FROM stooges WHERE name = ANY ($1)", [ ['larry', 'curly', 'moe'] ], ...);

Observe que =ANY é outra maneira de escrever IN (...), mas, diferentemente de IN (...), funcionará como você esperaria ao passar uma matriz como parâmetro de consulta.

Se você souber o comprimento do array com antecedência, poderá achatá-lo em uma lista IN:
// passing a flat array of values will work:
client.query("SELECT * FROM stooges WHERE name IN ($1, $2, $3)", ['larry', 'curly', 'moe'], ...);

... mas há pouco benefício quando =ANY funciona com uma matriz JavaScript.

Se você estiver em uma versão antiga do node-postgres ou precisar criar arrays PostgreSQL mais complexos (arrays de tipos compostos, etc.) com os quais o node-postgres não está lidando, você pode gerar um literal de array com SQL dinâmico, mas tenha muito cuidado com a injeção de SQL ao fazer isso. A abordagem a seguir é segura porque gera uma string de consulta com parâmetros de consulta e uma lista de parâmetros achatada, então você ainda está usando o suporte do driver para consultas parametrizadas ("declarações preparadas") para proteger contra injeção de 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, ...);

Espero que ajude, pois o google não consegue encontrar isso