sql server 2008 r2 -在合并语句中比较Null和Null



当处理数十亿条记录以比较合并语句中的NULL时,哪个语句是完美的或更好的。我已经尝试过SET ANSI_NULLS OFF,但这在合并语句中不起作用。这是我的两种方法

ISNULL(SRCColumn,-11111) = ISNULL(DSTColumn, -11111)

SRCColumn = DSTColumn OR (SRCColumn  IS NULL AND DSTColumn  IS NULL)
如果有更好的处理方法,请告诉我。因为我有大约15列要比较。

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, ...

如何在匹配时使用NOT比较:

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
...

最新更新