sql >> Base de Datos >  >> RDS >> PostgreSQL

JavaScript (Postgres DB):cómo usar una declaración preparada con una matriz como parámetro en la cláusula WHERE IN ()

Se describe en las preguntas frecuentes 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

¿Cómo construyo una consulta WHERE foo IN (...) para encontrar filas que coincidan con una matriz de valores? Node-postgres admite la asignación de matrices de JavaScript simples a matrices de PostgreSQL, por lo que en la mayoría de los casos puede pasarlo como cualquier otro parámetro.

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

Tenga en cuenta que =ANY es otra forma de escribir IN (...), pero a diferencia de IN (...) funcionará como esperaría cuando pasa una matriz como parámetro de consulta.

Si conoce la longitud de la matriz de antemano, puede aplanarla en una lista IN:

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

... pero hay pocos beneficios cuando =ANY funciona con una matriz de JavaScript.

Si tiene una versión anterior de node-postgres o necesita crear matrices de PostgreSQL más complejas (matrices de tipos compuestos, etc.) que node-postgres no puede manejar, puede generar una matriz literal con SQL dinámico, pero tenga mucho cuidado con la inyección de SQL al hacer esto. El siguiente enfoque es seguro porque genera una cadena de consulta con parámetros de consulta y una lista de parámetros planos, por lo que todavía está utilizando el soporte del controlador para consultas parametrizadas ("declaraciones preparadas") para protegerse contra la inyección 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 ayude ya que Google no puede encontrar esto