Сравнение 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
...
Другие вопросы по тегам