在什么情况下在合并更新中使用or / nvl组合很有用,它有什么作用? (如果很好)。波纹管的典型结构。
MERGE INTO data_table p
USING (SELECT pk,
col1,
col2,
col3
FROM incoming_data_table) pp
ON (p.pk = pp.pk)
WHEN MATCHED THEN
UPDATE
SET p.col1 = pp.col1,
p.col2 = pp.col2,
p.col3 = pp.col3
WHERE nvl(p.col1, '0') != nvl(pp.col1, '0') -- Line in question
OR nvl(p.col2, '0') != nvl(pp.col2, '0') -- Line in question
OR nvl(p.col3, '0') != nvl(pp.col3, '0') -- Line in question
WHEN NOT MATCHED THEN
INSERT
(p.pk,
p.col1,
p.col2,
p.col3)
VALUES
(pp.pk,
pp.col1,
pp.col2,
pp.col3);
答案 0 :(得分:1)
然后,NVL确保将null解释为任何其他值。因为没有NVL,1=null
都不为真,1!=null
也不为真。他们都返回假。但是由于查询的作者希望进行更新,例如当p.col1
包含123
并且p.col2
包含null
时,需要NVL。以下是一些适合您的情况:
select 'true' from dual where 1!=null; -- false
select 'true' from dual where 1=null; -- false
select 'true' from dual where 1=nvl(null,0); -- false
select 'true' from dual where 1!=nvl(null,0); -- true
NULL在比较中非常特殊。甚至不是这样:
select 'true' from dual where null=null; -- false
有关更多示例,请参见此页上的“条件中的空值”表:https://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements005.htm