在我的合并声明中,我想有条件地设置这两个值
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语句,但它们没有用。
任何人都有这方面的经验/想法吗?
答案 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在他的出色回答中所证明的那样。
你问过decode
。 decode
基本上是一个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只是试图修改记录,并且无论数据是否相同都会触发触发器。