我正在编写一个带有一些case语句的更新查询。当情况不满足时,它将用NULL更新列
以下是查询:
UPDATE TGT
SET C1 = CASE WHEN TGT.c2 = SRC.c2 AND SRC.C3 = 'P' THEN SRC.C1 ELSE NULL END,
C4 = CASE WHEN TGT.c5 = SRC.c5 AND SRC.C3 = 'D' THEN SRC.C4 ELSE NULL END
FROM SRC;
即使数据存在于Source表中,也始终填充NULL。
先谢谢你的帮助。
答案 0 :(得分:2)
Oracle在from
语句中不支持join
或update
。但是,您可以使用子查询:
UPDATE TGT
SET C1 = (CASE WHEN EXISTS (SELECT 1
FROM SRC
WHERE TGT.c2 = SRC.c2 AND SRC.C3 = 'P'
THEN TGT.C1 ELSE NULL
END);
注意:以上内容将更新所有行。如果您只想更新不匹配的行,请在not exists
子句中使用where
:
UPDATE TGT
SET C1 = NULL
WHERE NOT EXISTS (SELECT 1
FROM SRC
WHERE TGT.c2 = SRC.c2 AND SRC.C3 = 'P'
);
答案 1 :(得分:0)
你想设置c1
null,其中没有相关的' P' src
中的记录存在。因此使用NOT EXISTS
:
UPDATE tgt
SET c1 = NULL
WHERE NOT EXISTS
(
SELECT *
FROM src
WHERE src.c2 = tgt.c2 = AND src.c3 = 'P'
);
更新:您刚刚更改了问题,现在有两个不同的字段要在两种不同的情况下设置为null。我建议您只使用两个语句:上面针对c1
,类似针对c4
。不需要让事情变得比实际更复杂。