Сравнение Null с Null в операторе слияния
Какое утверждение идеально или лучше при работе с миллиардом записей для сравнения NULL в операторе слияния. Я попытался с SET ANSI_NULLS OFF, но это не сработало в заявлении слияния. Вот мои два способа
ISNULL(SRCColumn,-11111) = ISNULL(DSTColumn, -11111)
Или же
SRCColumn = DSTColumn OR (SRCColumn IS NULL AND DSTColumn IS NULL)
Пожалуйста, дайте мне знать, если есть лучший способ справиться с этим. Поскольку у меня есть около 15 столбцов для сравнения.
2 ответа
SRCColumn = DSTColumn OR (SRCColumn IS NULL AND DSTColumn IS NULL)
Я бы посоветовал вам использовать эту версию, потому что она наиболее точно отражает то, что вы хотите, чтобы SQL Server делал.
Оба оператора логически эквивалентны (если только -11111 не является допустимым значением для столбца), однако этот оператор гораздо более узнаваем, и, вероятно, разница во времени выполнения этих двух операторов незначительна.
Если вас больше интересует краткость, а не производительность, CHECKSUM() также является опцией. Это будет соответствовать NULL -> NULL:
MERGE A
USING B
ON A.Key = B.Key
WHEN MATCHED AND CHECKSUM(A.Col1, A.Col2, ... ) <> CHECKSUM(B.Col1, B.Col2, ... )
THEN UPDATE SET Col1 = B.Col1, Col1 = B.Col2, ...
Как насчет использования НЕ сравнения при сопоставлении:
MERGE [TGT]
USING [SRC]
ON [SRC].Key = [TGT]. Key
…
WHEN MATCHED AND
(
NOT ([TGT].[dw_patient_key] = [SRC].[dw_patient_key] OR ([TGT].[dw_patient_key] IS NULL AND [SRC].[dw_patient_key] IS NULL))
OR NOT ([TGT].[dw_patient_key] = [SRC].[dw_patient_key] OR ([TGT].[dw_patient_key] IS NULL AND [SRC].[dw_patient_key] IS NULL))
...
)
THEN UPDATE
...