了解ORACLE中CASE语句的UPDATE评估所有行

时间:2019-02-15 02:34:34

标签: sql oracle11g

我试图了解我在Toad for Oracle 12.1中编写的查询结果。

我的测试表包含3列:

EMPID   LOGGEDIN   CURRENT_MONITOR
00001          1                 1
00002          1
00003          1
00004          2

以下SQL将更新该表,以便将CURRENT_MONITOR中的值从一个用户交换到另一个用户(在这种情况下,从'00001'到'00003'):

UPDATE CLOSED_AREA_ACCESS
SET CURRENT_MONITOR = 
CASE
  WHEN EMPID = '00001' THEN NULL
  WHEN EMPID = '00003' THEN 1
END
WHERE LOGGEDIN = 1;

运行此命令时,Toad返回消息,指出已更新3行。我了解到有3条匹配记录,其中LOGGEDIN为1,但是我想知道为什么Toad不声明2条记录已更新。这是因为它需要遍历WHERE子句返回的结果来执行更新吗?感谢您的提前帮助。

1 个答案:

答案 0 :(得分:4)

您可以在WHERE子句中添加逻辑,这也限制了EMPID的值:

UPDATE CLOSED_AREA_ACCESS
SET CURRENT_MONITOR = 
CASE
    WHEN EMPID = '00001' THEN NULL
    WHEN EMPID = '00003' THEN 1
END
WHERE
    LOGGEDIN = 1 AND
    EMPID IN ('00001', '00003');

另一种方法是在ELSE表达式中添加一个CASE条件,该条件实际上是不执行操作,只是将CURRENT_MONITOR重新分配给自身:

UPDATE CLOSED_AREA_ACCESS
SET CURRENT_MONITOR = 
CASE
    WHEN EMPID = '00001' THEN NULL
    WHEN EMPID = '00003' THEN 1
    ELSE CURRENT_MONITOR
END
WHERE LOGGEDIN = 1;