Слияние данных с или / nvl в предложении где, какая выгода? - PullRequest
0 голосов
/ 01 октября 2018

В каких случаях полезно использовать или / nvl combo в обновлении слиянием и для чего это нужно?(Если это вообще хорошо).Типичная структура ниже.

   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 голосов
/ 01 октября 2018
  • ИЛИ удостоверяются, что обновление выполнено, как только одно из трех условий выполнено.С AND все три должны быть выполнены до обновления.Поэтому, как только хотя бы один из столбцов будет отличаться, должно произойти обновление.
  • , тогда 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...