在合并语句中比较Null和Null

时间:2013-01-10 16:30:20

标签: sql-server-2008-r2 isnull merge-statement

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

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

或者

SRCColumn = DSTColumn OR (SRCColumn  IS NULL AND DSTColumn  IS NULL)

如果有更好的方法可以解决,请告诉我。因为我有大约15列要比较。

3 个答案:

答案 0 :(得分:3)

  

SRCColumn = DSTColumn OR (SRCColumn IS NULL AND DSTColumn IS NULL)

我建议您使用此版本,因为它最准确地表达了您希望SQL Server执行的操作。

两个语句在逻辑上是等价的(除非-11111是列的合法值),但是这个语句更容易识别,并且两个语句的运行时性能可能只有微不足道的差异。

答案 1 :(得分:1)

如果你更关心简洁而不是表现,那么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, ...

答案 2 :(得分:0)

如何在匹配中使用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
...