进行合并时,我需要进行类似的比较:
WHEN MATCHED AND (Target.Field1 <> Source.Field1 OR ...)
额外的检查是为了避免更新所有列均已相同的行。为了我的目的,我想NULL <> anyValue
成为真实,而NULL <> NULL
成为虚假。
解决方案演变如下:
第一次尝试:
WHEN MATCHED AND
(
(
Target.Field1 IS NOT NULL
AND Source.Field1 IS NOT NULL
AND Target.Field1 <> Source.Field1
)
OR
(
Target.Field1 IS NULL
AND Source.Field1 IS NOT NULL
)
OR
(
Target.Field1 IS NOT NULL
AND Source.Field1 IS NULL
)
)
第二次尝试:
WHEN MATCHED AND
(
NOT (Target.Field1 IS NULL OR Source.Field1 IS NULL)
AND Target.Field1 <> Source.Field1
OR (Target.Field1 IS NULL OR Source.Field1 IS NULL)
AND NOT (Target.Field1 IS NULL AND Source.Field1 IS NULL)
)
第三次尝试(受@THEn的回答启发):
WHEN MATCHED AND
(
ISNULL(
NULLIF(Target.Field1, Source.Field1),
NULLIF(Source.Field1, Target.Field1)
) IS NOT NULL
)
可以使用相同的ISNULL / NULLIF逻辑来测试相等和不相等:
- 平等:
ISNULL(NULLIF(A, B), NULLIF(B, A)) IS NULL
- 不平等:
ISNULL(NULLIF(A, B), NULLIF(B, A)) IS NOT NULL
这是一个SQL小提琴,演示了它的工作方式http://sqlfiddle.com/#!3/471d60/1
MY_FIELD{1,6}
(从表中)和变量@IN_MY_FILED{1,6}
nullables还是仅仅是MY_FIELD{1,6}
?