1

私は(この質問のために簡略化された)2つの列'id'(整数でdbではnullではない)と'value'(varcharでdbではnullではない)を持つテーブル'TAB'を持っています。私はJavaアプリケーションを使用して、一度に複数の行の「値」列を更新しています(これは私の要件です)。私はcaseとwhenキーワードでupdateステートメントを使用しました。クエリは、変更された行の数に応じて実行時に生成されます。

データがすべての行に対して一緒に更新される場合、クエリは正常に機能しますが、より少ない行に対して更新されるとエラーが発生します。id = 1、2、3の3つの行があり、値はそれぞれA、B、Cであるとします。
クエリが3つの行すべてに対して一緒に実行されると、正常に機能します

UPDATE 
     TAB set value = CASE 
       WHEN id = 1 THEN 'X' WHEN id = 2 THEN 'Y' WHEN id = 3 THEN 'Z' 
END

しかし、クエリが3行未満で実行されると、DBエラーが発生します。

UPDATE TAB set value = CASE WHEN id = 1 THEN 'X' END

次のエラーが発生します。

DBエラー=ORA-01407:("XXX"。"XXX"。"VALUE")をNULLに更新できません。

DBの「value」列がnullではないため、これが発生していることはわかっています。上記のクエリが残りのすべての値をNULLで更新しようとしているかどうかを知りたいですか?

以下に説明するようにELSEパーツを追加すると、クエリは正常に機能します。

UPDATE TAB set value = CASE WHEN id = 1 THEN 'X' ELSE TAB.value END

DBに複数の行がある場合、上記のクエリはパフォーマンスの問題に影響しますか?

4

2 に答える 2

4

テーブル内のすべての行を更新しています。これは、 where句がないためです。

1つの行を更新するには、where句を追加します。

UPDATE TAB set value = CASE WHEN id = 1 THEN 'X' END where id = 1;

または、3列の場合は

UPDATE TAB set value = CASE WHEN id = 1 THEN 'X' WHEN id = 2 THEN 'Y'
WHEN id = 3 THEN 'Z' END where id in ( 1,2,3);
于 2012-05-22T06:06:20.347 に答える
2

あなたがこれをしている方法は完全に素晴らしいです。

UPDATE TAB set value = CASE WHEN id = 1 THEN 'X' ELSE TAB.value END

他の解決策は、where句を使用することです

UPDATE TAB set value = CASE WHEN id = 1 THEN 'X' when ID = 2 then 'Y' END where id in ( 1, 2 )
于 2012-05-22T06:07:22.857 に答える