我(已经简化了这个问题)一个表'TAB',其中两列'id'(db中的整数而不是null)和'value'(db中的varchar而不是null)。我正在使用java应用程序一次更新多行的'value'列(这是我的要求)。我用case和when关键字时使用update语句。根据修改的行数在运行时生成查询。
如果为所有行一起更新数据,则查询工作正常,但是在更新行更少时会出现错误。假设我们有三行id = 1,2和3,其值为A,B和C 当对所有三行一起触发查询时,它可以正常工作
UPDATE
TAB set value = CASE
WHEN id = 1 THEN 'X' WHEN id = 2 THEN 'Y' WHEN id = 3 THEN 'Z'
END
但是当查询被触发少于三行时,我遇到了DB错误。
UPDATE TAB set value = CASE WHEN id = 1 THEN 'X' END
导致以下错误:
DB错误= ORA-01407:无法更新(“XXX”。“XXX”。“VALUE”)为NULL。
我知道这种情况正在发生,因为“值”列在DB中不为空。我想知道上面的查询是否试图用NULL更新所有剩余的值?
如果我按照下面的说明添加ELSE部分,则查询工作正常。
UPDATE TAB set value = CASE WHEN id = 1 THEN 'X' ELSE TAB.value END
如果DB中有多行,上述查询是否会影响任何性能问题。
答案 0 :(得分:4)
您正在更新表格中的所有行。这是因为您没有 where 子句。
要更新一行,请添加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);
答案 1 :(得分: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 )