gpt4 book ai didi

sql-server - 有没有办法简化 2 个值的 NULL 比较

转载 作者:行者123 更新时间:2023-12-05 09:35:04 26 4
gpt4 key购买 nike

这是我的简化声明

SELECT ...
FROM tab1 AS i FULL OUTER JOIN tab2 AS d ON i.[Id]=d.[Id]
WHERE d.[Data]<>i.[Data] OR
(d.[Data] IS NULL AND i.[Data] IS NOT NULL) OR
(d.[Data] IS NOT NULL AND i.[Data] IS NULL)

我想获取所有条目

  1. i.[Data] 不同于 d.[Data]
  2. 表i或d中至少有一个值是NOT NULL

所以我不想看到记录 were 和 i 和 d 包含相同的数据或者都是 NULL。

我的陈述看起来又长又复杂。有没有更简单的方法?

使用 ISNULL(d.[Data],'')<>ISNULL(i.[Data],'')适用于文本,但不适用于 DATETIME(0)列。

我的陈述适用于所有类型。

最佳答案

是的,你可以,你也可以让优化器识别它。

Paul White has this little ditty :

WHERE NOT EXISTS (
SELECT d.[Data]
INTERSECT
SELECT i.[Data])

这是因为 INTERSECT 的语义。处理空值。这就是说“在由值 B 和值 B 组成的子查询中是否有没有行”,只有当它们是不同的值或者一个为空而另一个不为空时才会满足。如果两者都为空,则将有一行为空。


如果您检查 XML 查询计划(不是 SSMS 中的图形查询计划),您会看到它一直编译到 d.[Data] <> i.[Data]。 , 但它使用的运算符将有 CompareOp="IS"而不是 EQ .

查看完整计划 here .

计划的相关部分是:

                <Predicate>
<ScalarOperator ScalarString="@t1.[i] as [t1].[i] = @t2.[i] as [t2].[i]">
<Compare CompareOp="IS">
<ScalarOperator>
<Identifier>
<ColumnReference Table="@t1" Alias="[t1]" Column="i" />
</Identifier>
</ScalarOperator>
<ScalarOperator>
<Identifier>
<ColumnReference Table="@t2" Alias="[t2]" Column="i" />
</Identifier>
</ScalarOperator>
</Compare>
</ScalarOperator>
</Predicate>

我发现优化器以这种方式工作得很好,而不是做 EXISTS / EXCEPT .


我敦促您投票给 Azure Feedback实现适当的运营商

关于sql-server - 有没有办法简化 2 个值的 NULL 比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66138082/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com