4

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

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

或者

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

请让我知道是否有更好的方法来处理它。因为我有大约 15 列要比较。

4

3 回答 3

4

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

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

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

于 2013-03-18T02:01:02.110 回答
2

如果您更关心简洁而不是性能,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, ...
于 2014-07-14T14:17:48.583 回答
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
...
于 2019-06-10T01:37:00.733 回答