真正的空安全比较

问题描述 投票:0回答:2

是否有一种真正安全的方法来检查 T-SQL 中两个可空值是否不相等且比这短?

where
    A.MyField != B.MyField
or  (
        A.MyField is null
    and B.MyField is not null
)
or  (
        A.MyField is not null
    and B.MyField is null
)

使用

isnull()
并不真正安全,因为它将
null
值折叠为数据集中可能存在的“真实”值,例如:

where
    isnull(A.MyField, '') != isnull(B.MyField, '')

会错误地认为空字符串

''
null
相等,这不是期望的结果。您可以想出一个永远不会发生或极不可能发生的“已知”值,但这似乎是一个创可贴修复。

出于多种原因,关闭

ANSI_NULLS
也是不可取的(尤其是该功能正在被贬值)。

是否有功能可以进行“真正的”空安全检查,或者上面的代码是最好的方法吗?

sql-server t-sql
2个回答
3
投票

对于 2005 年以上的版本 您可以使用

WHERE  EXISTS (SELECT A.MyField
               EXCEPT
               SELECT B.MyField) 

从 SQL Server 2022 开始 您可以使用

WHERE  A.MyField IS DISTINCT FROM B.MyField

0
投票

有人可以说你的问题表明了一种实现方法,你想要“不等于”,所以让我们编写相等的代码,然后我们否定它:

where
  not (
    A.MyField = B.MyField
    or (
      A.MyField is null
      and
      B.MyField is null
    )
  )
© www.soinside.com 2019 - 2024. All rights reserved.