如何在Oracle Merge Update中有条件地设置X = Y?

时间:2014-07-29 18:27:55

标签: sql oracle

在我的合并声明中,我想有条件地设置这两个值

MERGE INTO 
...
...
WHEN MATCHED THEN
UPDATE SET
NC.A=OC.Date IF NC.status='D', 
NC.B=OC.Date IF NC.status='O'; 

这可以在MERGE声明中完成吗?我听说过DECODE,并想知道是否可以使用它。我已经尝试过CASE和IF语句,但它们没有用。

任何人都有这方面的经验/想法吗?

2 个答案:

答案 0 :(得分:3)

我希望CASE表达能够起作用。尝试:

MERGE INTO 
...
...
WHEN MATCHED THEN
  UPDATE SET
    NC.A = CASE WHEN NC.status = 'D' THEN OC.Date ELSE NC.A END,
    NC.B = CASE WHEN NC.STATUS = 'O' THEN OC.Date ELSE NC.B END;

试一试。

分享并享受。

答案 1 :(得分:1)

你可以用case声明来做到这一点,正如Bob Jarvis在他的出色回答中所证明的那样。

你问过decodedecode基本上是一个case-statement-as-a-function,所以它也可以工作:

MERGE INTO 
...
...
WHEN MATCHED THEN
  UPDATE SET
    NC.A = decode(NC.status, 'D', OC.Date, NC.A),
    NC.B = decode(NC.STATUS, 'O', OC.Date, NC.B);

我个人几乎在任何时候使用case而不是decode,因为您只保存了几个字符而decode的可读性较低(您必须计算参数才能看到)哪个是。

无论你选择哪个;诀窍是将NC.A设置为NC.A,以防条件满足。您无法为设置本身添加条件。您总是为NC.A分配一个值,因此保持不变的唯一方法是将其设置为已有的值。

但请注意,将针对这些行触发任何更新触发器。 Oracle只是试图修改记录,并且无论数据是否相同都会触发触发器。