Итак, мы используем 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 с совпадением и пересечением, но мы заметили, что это не оптимально для миллионов записей.
Есть ли другие жизнеспособные варианты, которые могут быть реализованы?