sql >> Databasteknik >  >> RDS >> PostgreSQL

Bästa praxis för att skapa SQL SELECT-frågor medan du hanterar potentiella odefinierade värden

Det här problemet är detsamma som loggades här:https://github.com /vitaly-t/pg-promise/issues/442

I grund och botten, pg-promise frågeformateringsmotorn genererar SQL enligt dina formateringsparametrar. Den gör INTE någon syntaxverifiering på din resulterande SQL.

Du genererar IN () , som är ogiltig SQL, så du får felet.

Du bör kontrollera förekomsten av variabeln och inte ens försöka generera en sådan fråga när variabeln saknas, eftersom din fråga inte skulle kunna ge något bra då.

Exempel:

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

Det kan finnas andra lösningar, som pg-promise är mycket generisk, det begränsar inte hur du närmar dig detta.

Till exempel, istället för detta:

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

du kan göra så här:

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

vilket ger samma resultat. Vilket du än gillar!;)



  1. postgresql - sql - antal "sanna" värden

  2. Hur ställer man in timeout för anslutning i groovy sql?

  3. Skapa MySQL-tabell med PHP-variabel

  4. Utdataparameter för MySQL-lagrade procedurer via ADODB i MS Access (VBA) korrekt på en dator och slumpmässig på en annan