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

Mejores prácticas para crear consultas SQL SELECT mientras se manejan posibles valores indefinidos

Este problema es el mismo que se registró aquí:https://github.com /vitaly-t/pg-promise/issues/442

Básicamente, pg-promise El motor de formato de consultas genera SQL de acuerdo con sus parámetros de formato. NO realiza ninguna verificación de sintaxis en su SQL resultante.

Estás generando IN () , que es un SQL no válido, por lo que obtiene el error.

Debe verificar la presencia de la variable y ni siquiera intentar generar una consulta de este tipo cuando falta la variable, porque su consulta no podría arrojar nada bueno en ese momento.

Ejemplo:

router.get('/search', (req, res, next) => {
    const variables = ['variable_a', 'variable_b', 'variable_c'];
    const conditions = variables.filter(v => v in req.query)
        .map(v => pgp.as.format('$1:name IN ($2:csv)', [v, req.query[v]]))
        .join(' AND ');

    conditions = conditions && 'WHERE ' + conditions;

    db.any('SELECT * FROM food $1:raw', conditions)
        .then(result => res.send(result))
        .catch(error => {/* handle the error */});
});

Puede haber otras soluciones, como pg-promise es muy genérico, no te limita la forma en que abordas esto.

Por ejemplo, en lugar de esto:

v => pgp.as.format('$1:name IN ($2:csv)', [v, req.query[v]])

puedes hacer esto:

v => pgp.as.name(v) + ' IN (' + pgp.as.csv(req.query[v]) + ')';

que producirá el mismo resultado. ¡Lo que quieras!;)