测试 T-SQL 中的不等式

Posted

技术标签:

【中文标题】测试 T-SQL 中的不等式【英文标题】:Testing for inequality in T-SQL 【发布时间】:2008-08-11 15:56:42 【问题描述】:

我刚刚在 WHERE 子句中遇到了这个问题:

AND NOT (t.id = @id)

与此相比如何:

AND t.id != @id

或与:

AND t.id <> @id

我总是自己写后者,但显然其他人的想法不同。一个会比另一个表现更好吗?我知道使用&lt;&gt;!= 会破坏使用我可能拥有的索引的任何希望,但是肯定上面的第一种方法会遇到同样的问题吗?

【问题讨论】:

另见:***.com/questions/723195/… 语法 NOT (...) 是不好的做法,因为代码很容易被否定为肯定或 de Morgan'd 由于可读性。比如,你不应该写像IF (NOT(A)) THEN [x] ELSE [y] END这样的代码,而你可以写IF (A) THEN [y] ELSE [x] END 【参考方案1】:

这3个会得到完全相同的执行计划

declare @id varchar(40)
select @id = '172-32-1176'

select * from authors
where au_id <> @id

select * from authors
where au_id != @id

select * from authors
where not (au_id = @id)

当然,这也取决于索引本身的选择性。我自己总是使用 au_id @id

【讨论】:

这些子句如何处理空值?它们都是等价的吗? @FistOfFury,与 NULL 比较总是返回 NULL 并阻止匹配(除非你 changed the ANSI NULLs setting),所以你永远不会得到 au_id 为空的记录,如果@987654324 你也永远不会得到记录@ 一片空白。在这种情况下,您需要实际编写 WHERE ... IS NULLWHERE ... IS NOT NULL 这有助于我将 NULL 视为“未知”,那么它是有道理的:您不知道 @id 是否与未知值相同! tl;dr 是的,即使在 NULL 的情况下它们也是等价的。【参考方案2】:

请注意,!= 运算符不是标准 SQL。如果您希望您的代码可移植(也就是说,如果您关心的话),请改用 。

【讨论】:

【参考方案3】:

要考虑等于 null 的逻辑风险

等式运算符在有空值时生成未知值 未知值被视为falseNot (unknown) 仍然是 unknown

在下面的示例中,我将询问一对 (a1, b1) 是否等于 (a2, b2)。 请注意,每一列都有 3 个值:01NULL

DECLARE @t table (a1 bit, a2 bit, b1 bit, b2 bit)

Insert into @t (a1 , a2, b1, b2) 
values( 0 , 0 , 0 , NULL )

select 
a1,a2,b1,b2,
case when (
    (a1=a2 or (a1 is null and a2 is null))
and (b1=b2 or (b1 is null and b2 is null))
)
then 
'Equal'
end,
case when not (
    (a1=a2 or (a1 is null and a2 is null))
and (b1=b2 or (b1 is null and b2 is null))
)
then 
'Not Equal'
end,
case when (
    (a1<>a2 or (a1 is null and a2 is not null) or (a1 is not null and a2 is null))
or (b1<>b2 or (b1 is null and b2 is not null) or (b1 is not null and b2 is null))
)
then 
'Different'
end
from @t

注意这里,我们期望的结果是:

等于为空 不等于不 相等 不同就是不同

但是,我们得到了另一个结果

Equal 为 null - 我们的预期。 不等于为空??? 不同就是不同 - 我们的预期。

【讨论】:

【参考方案4】:

不会影响性能,两个语句完全相等。

HTH

【讨论】:

以上是关于测试 T-SQL 中的不等式的主要内容,如果未能解决你的问题,请参考以下文章

为什么我可以像原始一样测试Wrappers的不等式?我可以为我创建的课程吗? [重复]

有限元分析中的常识(持续更新)

有限元分析中的常识(持续更新)

有没有办法匹配 Python ≥ 3.10 中的不等式?

python的不等式/数值+条件语句?

GADT 可以用来证明 GHC 中的类型不等式吗?