当处理数十亿条记录来比较合并语句中的NULL时,哪种语句是完美的还是更好的。我已尝试使用SET ANSI_NULLS OFF但在merge语句中不起作用。这是我的两种方式
ISNULL(SRCColumn,-11111) = ISNULL(DSTColumn, -11111)
或者
SRCColumn = DSTColumn OR (SRCColumn IS NULL AND DSTColumn IS NULL)
如果有更好的方法可以解决,请告诉我。因为我有大约15列要比较。
答案 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
...