sql-server - 真正的空安全比较

标签 sql-server t-sql

是否有一种真正安全的方法来检查 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 关闭也是不可取的。

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

最佳答案

对于 2005 年以上的版本 You can use

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

来自 SQL Server 2022 you can use

WHERE  A.MyField IS DISTINCT FROM B.MyField

关于sql-server - 真正的空安全比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53176564/

相关文章:

t-sql - 根据年份选择不同的表

sql - 外连接/子查询遇到问题

sql-server - XPath 查询 : parsing multiple paths using the same query (Cross Apply/. 节点() )

c# - 错误: The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION

SQL 查询 - 以更简单的方式重写

sql - 如何在 JOIN-ed 表上执行 JOIN?

mysql - SQL查询使用查询同一个表的子查询来过滤行

sql-server - 如何提高查询性能

sql - 如何在sql server中获取从当前日期时间到过去7天的过去7天的数据

sql-server - 如何获取所有存储过程执行时间,杯子时间等