1

次のスキーマが与えられた場合 (例として)

CREATE TABLE "test" (
  "id" int, 
  "title" varchar
);

NodeJSでは、次のようにUPDATEを試みます

client.query(
            'WITH new_vals ("id","title") AS (VALUES($1,$2)) ' +
            'UPDATE "test" "t" SET "id"=nv.id, "title"=nv.title ' +
            'FROM new_vals nv ' +
            'WHERE "t"."id"=nv.id;',
        [1,'test'],
        function(err, res){ ... }
);

そして、次のエラーが表示されます: 「エラー: 演算子が存在しません: 整数 = テキスト」

"t"."id"=nv.idでは、使用をやめて、使用可能なパラメーターの 1 つだけを再利用してみましょう。

client.query(
            'WITH new_vals ("id","title") AS (VALUES($1,$2)) ' +
            'UPDATE "test" "t" SET "id"=nv.id, "title"=nv.title ' +
            'FROM new_vals nv ' +
            'WHERE "t"."id"=$1;',
        [1,'test'],
        function(err, res){ ... }
);

まだ'エラー: 演算子が存在しません: 整数 = テキスト' .

$3では、別のプレースホルダーを追加しましょう。

client.query(
            'WITH new_vals ("id","title") AS (VALUES($1,$2)) ' +
            'UPDATE "test" "t" SET "id"=nv.id, "title"=nv.title ' +
            'FROM new_vals nv ' +
            'WHERE "t"."id"=$3;',
        [1,'test',1],
        function(err, res){ ... }
);

別のエラー: 「エラー: 列 "id" は整数型ですが、式はテキスト型です」

私は完全に迷っています。intWHERE で演算子クラスを使用しないのはなぜですか? ここで何が問題なのですか?

奇妙なUPDATEことに、句のない標準形はWITHうまく機能します...

遊ぶためのコードが必要な場合: https://gist.github.com/kolypto/7455957

4

1 に答える 1

2

この文脈では:

WITH new_vals ("id","title") AS (VALUES($1,$2))

PostgreSQL はどの型になる$1か、またはどのような型$2になるかを認識していないため、最終的にはテキスト値として扱われます。細かいマニュアルには次のように記載されています。

VALUESで を使用するとINSERT、値はすべて、対応する宛先列のデータ型に自動的に変換されます。他のコンテキストで使用する場合は、正しいデータ型を指定する必要がある場合があります。

およびvalues($1, $2)では、型を推測できないため、明示的にする必要があります。

WITH new_vals ("id", "title") AS (VALUES($1::integer, $2::text))

キャストオン$2は必要ありませんが、一貫性を保ちたいです。

于 2013-11-13T21:05:43.367 に答える