在where子句中使用or / nvl合并数据,有什么好处?

时间:2018-10-01 10:07:01

标签: oracle

在什么情况下在合并更新中使用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);

1 个答案:

答案 0 :(得分:1)

  • OR会确保满足以下三个条件之一就立即完成更新。使用AND的话,在进行更新之前,必须满足这三个条件。因此,至少有一个col的差异会立即进行更新。
  • 然后,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