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

Bedste praksis til at oprette SQL SELECT-forespørgsler, mens du håndterer potentielle udefinerede værdier

Dette problem er det samme, som blev logget her:https://github.com /vitaly-t/pg-promise/issues/442

Grundlæggende, pg-promise forespørgselsformateringsmotor genererer SQL i henhold til dine formateringsparametre. Det udfører IKKE nogen syntaksbekræftelse på din resulterende SQL.

Du genererer IN () , som er ugyldig SQL, så du får fejlen.

Du bør tjekke for tilstedeværelsen af ​​variablen og ikke engang forsøge at generere en sådan forespørgsel, når variablen mangler, fordi din forespørgsel ikke ville være i stand til at give noget godt.

Eksempel:

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

Der kan være andre løsninger, som pg-promise er meget generisk, det begrænser dig ikke den måde, du griber dette an på.

For eksempel i stedet for dette:

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

du kan gøre dette:

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

hvilket vil give samme resultat. Uanset hvad du kan lide!;)



  1. Sådan finder og erstatter du tekst i mysql-tabel

  2. Kardinalitetsvurdering for et prædikat på et COUNT udtryk

  3. Konverter Oracle CONNECT BY-forespørgsel til SQL Server-forespørgsel

  4. MySQL runder datoen til starten af ​​ugen og måneden