sql >> Database >  >> RDS >> PostgreSQL

Best practice voor het maken van SQL SELECT-query's terwijl mogelijke ongedefinieerde waarden worden verwerkt

Dit probleem is hetzelfde als hier is vastgelegd:https://github.com /vitaly-t/pg-promise/issues/442

Kortom, pg-promise query formatting engine genereert SQL volgens uw opmaakparameters. Het voert GEEN syntaxisverificatie uit op uw resulterende SQL.

U genereert IN () , wat een ongeldige SQL is, dus je krijgt de foutmelding.

U moet de aanwezigheid van de variabele controleren en zelfs niet proberen een dergelijke zoekopdracht te genereren als de variabele ontbreekt, omdat uw zoekopdracht dan niets goeds zou kunnen opleveren.

Voorbeeld:

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

Er kunnen andere oplossingen zijn, zoals pg-promise is erg algemeen, het beperkt je niet in de manier waarop je dit benadert.

Bijvoorbeeld, in plaats van dit:

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

je kunt dit doen:

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

wat hetzelfde resultaat zal opleveren. Wat je ook leuk vindt!;)



  1. (var)char als het type kolom voor prestaties?

  2. Python psycopg2 wordt niet ingevoegd in postgresql-tabel

  3. Loop n keer zonder een opgeslagen procedure te gebruiken

  4. Hoe sqlparameter doorgeven aan IN()?