sql >> データベース >  >> RDS >> PostgreSQL

潜在的な未定義の値を処理しながらSQLSELECTクエリを作成するためのベストプラクティス

    この問題は、ここに記録されたものと同じです: https://github.com / vitaly-t / pg-promise / issues / 442

    基本的に、 pg-promise クエリフォーマットエンジンは、フォーマットパラメータに従ってSQLを生成します。結果のSQLに対して構文検証は行われません。

    IN ()を生成しています 、これは無効なSQLであるため、エラーが発生します。

    変数の存在を確認する必要があります。変数が欠落している場合は、そのようなクエリを生成しようとしないでください。クエリでは適切な結果が得られないためです。

    例:

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

    pg-promise のように、他の解決策もあります。 非常に一般的であり、これに取り組む方法を制限するものではありません。

    たとえば、これの代わりに:

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

    あなたはこれを行うことができます:

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

    同じ結果が得られます。どちらでもいいです!;)



    1. MySQLユーザーを特定のテーブルに制限するにはどうすればよいですか?

    2. ストアドプロシージャの出力をSQLServerの変数に返す方法

    3. SSH経由でC#からmysqlに接続する方法

    4. 実行中に致命的なエラーが発生しました...更新中に