Оператор обновления SQL - сравнение значений для пустых полей - PullRequest
0 голосов
/ 31 августа 2018

Итак, мы используем SQL Server в нашей среде DWH и сравниваем значения между источником и местом назначения, чтобы соответствующим образом обновить значения. В некоторых операторах Merge мы применяем условие соответствия вместе с оператором intersect, однако в некоторых случаях мы напрямую используем обновление и проверяем условие OR.

Однако, так как иногда мы можем иметь пустые поля, которые нужно сравнивать, это вызывает некоторые проблемы.

Мы попытались сделать следующие 3 варианта:

  • dest.col1 <> src.col1 - об этом не может быть и речи, потому что Nullables не будут соответствовать друг другу
  • isnull (dest.col1,0) <> isnull (src.col1,0) - также не вариант, поскольку поля могут содержать как нули, так и нули. Если что-то пойдет не так и потребуется перезагрузка, значения могут быть как нулевыми, так и числовыми
  • ((dest.col1 <> src.col1) ИЛИ (dest.col1 имеет значение NULL, а src.col1 не имеет значение NULL) ИЛИ (dest.col1 не имеет значение NULL, а src.col1 имеет значение NULL)) - также не вариант поскольку у нас есть миллионы записей, и это потребует больше строк, чем необходимо для обновления.

Мы могли бы использовать аналогичный подход к оператору Merge с совпадением и пересечением, но мы заметили, что это не оптимально для миллионов записей.

Есть ли другие жизнеспособные варианты, которые могут быть реализованы?

1 Ответ

0 голосов
/ 31 августа 2018

Попробуйте это СЛУЧАЙ КОГДА пример кода:

    ;WITH CTE AS 
(
    SELECT *,
    CASE WHEN ColA IS NULL AND ColB IS NULL THEN 'Equal'
         WHEN ColB IS NOT NULL AND ColB IS NOT NULL 
                                               THEN CASE WHEN ColA = ColB THEN 'Equal'
                                               ELSE 'Not Equal' END
         WHEN ColA IS NULL AND ColB IS NOT NULL THEN 'Not Equal'
         WHEN ColB IS NULL AND ColA IS NOT NULL THEN 'Not Equal'
    END 'Comparison'
FROM YourTable
)                 

DELETE FROM CTE WHERE Comparison = 'Not Equal'
...