PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Procedura consigliata per la creazione di query SQL SELECT durante la gestione di potenziali valori non definiti

Questo problema è lo stesso registrato qui:https://github.com /vitaly-t/pg-promise/issues/442

Fondamentalmente, pg-promise il motore di formattazione delle query genera SQL in base ai parametri di formattazione. NON esegue alcuna verifica della sintassi sull'SQL risultante.

Stai generando IN () , che è un SQL non valido, quindi ottieni l'errore.

Dovresti verificare la presenza della variabile e non provare nemmeno a generare una query del genere quando la variabile è mancante, perché la tua query non sarebbe in grado di produrre nulla di buono in tal caso.

Esempio:

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 */});
});

Ci possono essere altre soluzioni, come pg-promise è molto generico, non ti limita il modo in cui ti avvicini.

Ad esempio, invece di questo:

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

puoi farlo:

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

che produrrà lo stesso risultato. Quello che ti piace!;)