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

JavaScript(Postgres DB)-WHERE IN()句のパラメーターとして配列を使用したプリペアドステートメントの使用方法

    これは、node-postgres https://github.com/brianc/node-postgres/wiki/FAQ#11-how- do-i-build-a-where-foo-in--query-to-find-rows-matching-an-array-of-values

    WHERE foo IN(...)クエリを作成して、値の配列に一致する行を見つけるにはどうすればよいですか?node-postgresは単純なJavaScript配列からPostgreSQL配列へのマッピングをサポートしているため、ほとんどの場合、他の配列と同じように渡すことができます。パラメータ。

    client.query("SELECT * FROM stooges WHERE name = ANY ($1)", [ ['larry', 'curly', 'moe'] ], ...);
    

    =ANYはIN(...)を記述する別の方法ですが、IN(...)とは異なり、配列をクエリパラメータとして渡すと期待どおりに機能することに注意してください。

    配列の長さが事前にわかっている場合は、それをINリストにフラット化できます。

    // passing a flat array of values will work:
    client.query("SELECT * FROM stooges WHERE name IN ($1, $2, $3)", ['larry', 'curly', 'moe'], ...);
    

    ...しかし、=ANYがJavaScript配列で機能する場合はほとんどメリットがありません。

    古いバージョンのnode-postgresを使用している場合、またはnode-postgresが対応していないより複雑なPostgreSQL配列(複合型の配列など)を作成する必要がある場合は、動的SQLを使用して配列リテラルを生成できますが、これを行うときは、SQLインジェクションに特に注意してください。次のアプローチは、クエリパラメータとフラット化されたパラメータリストを含むクエリ文字列を生成するため安全です。そのため、SQLインジェクションから保護するために、パラメータ化されたクエリ(「プリペアドステートメント」)に対するドライバのサポートを引き続き使用します。

    var stooge_names = ['larry', 'curly', 'moe'];
    var offset = 1;
    var placeholders = stooge_names.map(function(name,i) { 
        return '$'+(i+offset); 
    }).join(',');
    client.query("SELECT * FROM stooges WHERE name IN ("+placeholders+")", stooge_names, ...);
    

    グーグルがこれを見つけることができないので、それが役立つことを願っています




    1. テーブルがmysqlで大きくなるにつれて、挿入速度が遅くなります

    2. 正規化と複製を理解する-私はそうは思わない-アーティストとタイトルIDを追加する

    3. cPanelでデータベースを削除する方法

    4. mysqlの手順