13

pg-promise docsで推奨されているように、pg-promise のパラメーターの配列にパラメーターの配列を渡そうとしています。

db.any("SELECT fieldname FROM table WHERE fieldname = $1 AND fieldname2 IN ($2)",
        [1,[[1730442],[1695256]],[487413],[454336]]])
    .then(function (data) {
        console.log("DATA:", data); // print data;
    })
    .catch(); 

しかし、それは機能しません。「引数リストの後に ) がありません」というエラーが返されます。または、パラメーターを次のように置き換えると、「演算子が存在しません: 整数 = 整数 []]」エラーが発生します。

[1,[1730442]]

もちろん、このように渡すと動作します:

[1,1730442]

他のパラメータが関係している場合、値の配列を渡す適切な方法ですか?

また、$2 を囲む括弧を削除しようとしましたが、成功しませんでした。

4

2 に答える 2

25

私はpg-promiseの作者です。


あなたの例にはいくつかの混乱があります...

クエリで 2 つの変数のみを使用していますが、4 つの値を渡しています。

  • 1
  • [[1730442],[1695256]]
  • [487413]
  • [454336]

そして、あなたの構文には有効な JavaScript がありません。]最終的に一致するオープニングなしで使用しているため、渡そうとしているものを正確に理解するのは困難です。

そして、なぜすべての値を再び配列にラップするのでしょうか? IN()ステートメント内に必要な整数のリストにすぎないと思います。

内で値を使用する場合WHERE IN()、実際に渡す値の配列ではなく、コンマで区切られた値のリストです。

例を次のように変更すると:

db.any('SELECT fieldname FROM table WHERE fieldname = $1 AND fieldname2 IN ($2:csv)',
[1, [1730442,1695256,487413,454336]])

注入された値の正しいリストが得られます。

以下も参照してください。

于 2016-04-25T18:05:27.490 に答える
4

別の可能性は次のとおりです。

db.any("SELECT fieldname FROM table WHERE fieldname = $1 AND fieldname2 = any ($2)",
        [1,[1730442,1695256,487413,454336]])
    .then(function (data) {
        console.log("DATA:", data); // print data;
    })
    .catch(); 

ここのpostgresqlマニュアルから:https://www.postgresql.org/docs/9.5/static/functions-comparisons.html

右側は括弧で囲まれた式で、配列値を生成する必要があります。左側の式が評価され、指定された演算子を使用して配列の各要素と比較されます。これにより、ブール値の結果が得られる必要があります。いずれかの真の結果が得られた場合、ANY の結果は「真」になります。真の結果が見つからない場合 (配列の要素がゼロの場合を含む)、結果は「偽」になります。

配列式が NULL 配列を生成する場合、ANY の結果は NULL になります。左側の式が null を返す場合、ANY の結果は通常 null になります (厳密でない比較演算子では異なる結果が返される可能性があります)。また、右側の配列に null 要素が含まれていて、真の比較結果が得られない場合、ANY の結果は偽ではなく null になります (ここでも厳密な比較演算子を想定しています)。これは、NULL 値のブール値の組み合わせに関する SQL の通常の規則に従っています。

SOME は ANY の同義語です。

于 2016-11-03T14:07:51.200 に答える