node-postgres: "WHERE col IN (" を実行する方法 )"クエリですか? 質問する

node-postgres:

次のようなクエリを実行しようとしています:

SELECT * FROM table WHERE id IN (1,2,3,4)

問題は、フィルタリングする ID のリストが一定ではなく、実行ごとに異なる必要があることです。また、ID は信頼できないソースから取得される可能性があるため、ID をエスケープする必要がありますが、実際には、ソースの信頼性に関係なく、クエリに含まれるすべてのものをエスケープします。

node-postgres はバインドされたパラメータのみで動作するようです: client.query('SELECT * FROM table WHERE id = $1', [ id ]); これは、既知の値の数がある場合 ( client.query('SELECT * FROM table WHERE id IN ($1, $2, $3)', [ id1, id2, id3 ])) に動作しますが、配列を直接動作させることはできません: client.query('SELECT * FROM table WHERE id IN ($1)', [ arrayOfIds ])、配列パラメータの特別な処理はないようです。

配列内の項目数に応じてクエリ テンプレートを動的に構築し、ID 配列をクエリ パラメータ配列 (実際のケースでは ID リスト以外のパラメータも含まれています) に拡張するのは、不当に面倒なようです。クエリ テンプレートに ID リストをハードコーディングすることも、node-postgres が値をエスケープする方法を提供していないため、実行可能ではないようです。

これは非常に一般的な使用例のように思われるので、私が実際に何かを見落としているのであって、node-postgres で一般的な SQL 演算子を使用できないわけではないと推測しますIN (values)

もし誰かが、私が上に挙げた方法よりもエレガントな方法でこの問題を解決したなら、あるいは私が node-postgres について本当に何かを見逃しているなら、助けてください。

ベストアンサー1

@ebohlmanさんへのコメントを見ると、あなたは近かったようですね答えWHERE id = ANY($1::int[]). PostgreSQLは変換する配列を、パラメータがキャストされる型に変換します$1::int[]。以下は、私にとってはうまく機能する不自然な例です。

var ids = [1,3,4]; 

var q = client.query('SELECT Id FROM MyTable WHERE Id = ANY($1::int[])',[ids]);

q.on('row', function(row) {
  console.log(row);
})

// outputs: { id: 1 }
//          { id: 3 }
//          { id: 4 }

おすすめ記事