我正在编写一个带有一些case语句的更新查询。当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。
提前感谢您的帮助。
发布于 2017-02-20 20:20:12
Oracle在update语句中不支持from或join。但是,您可以使用子查询:
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);注意:以上操作将更新所有行。如果只想更新不匹配的行,那么在where子句中使用not exists:
UPDATE TGT
SET C1 = NULL
WHERE NOT EXISTS (SELECT 1
FROM SRC
WHERE TGT.c2 = SRC.c2 AND SRC.C3 = 'P'
);发布于 2017-02-20 20:38:19
您希望在src中不存在相关的'P‘记录的情况下设置c1 null。因此,请使用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。没有必要让事情变得比实际情况更复杂。
https://stackoverflow.com/questions/42344199
复制相似问题