sql >> Databáze >  >> RDS >> PostgreSQL

Nejlepší postup pro vytváření dotazů SQL SELECT při zpracování potenciálních nedefinovaných hodnot

Tento problém je stejný, jaký byl zaznamenán zde:https://github.com /vitaly-t/pg-promise/issues/442

V podstatě pg-promise dotazovací stroj pro formátování generuje SQL podle vašich parametrů formátování. Neprovádí žádné ověření syntaxe vašeho výsledného SQL.

Generujete IN () , což je neplatný SQL, takže se zobrazí chyba.

Měli byste zkontrolovat přítomnost proměnné a ani se nepokoušet generovat takový dotaz, když proměnná chybí, protože váš dotaz by pak nemohl přinést nic dobrého.

Příklad:

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

Mohou existovat i jiná řešení, například pg-promise je velmi obecný, neomezuje vás způsob, jakým k tomu přistupujete.

Například místo tohoto:

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

můžete to udělat:

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

což přinese stejný výsledek. Cokoli se vám líbí!;)



  1. Jak reprezentovat Oracle Interval v Javě

  2. Nelze vyřešit konflikt řazení

  3. Hekaton se zvratem:TVP v paměti – část 1

  4. Název sloupce Dynamic SQL Server Pivot ( UNPIVOT ) na hodnotu řádku