sql - 否定sql中的 "unknown"值

标签 sql sql-server t-sql

我目前正在通过学​​习《T-SQL Fundamentals Third Edition》这本书来学习SQL Server。书中有这样一句话:

One tricky aspect of the logical value “unknown” is that when you negate it, you still get “unknown”. For example, given the predicate “not (salary > 0)”, when salary is “null”, “salary > 0” evaluates to “unknown”, and “not known” remain “unknown”

我对声明背后的所有逻辑感到有点困惑,只是想知道是否有人能澄清一下?

有人还会添加代码示例吗?

最佳答案

让我们尝试解释一下。 NULL 表示“未知”值(尽管在实践中,它通常表示缺失值)。

当你有一个表达式,如“salary > 0”时,解释是“unknown value”> 0”。这是对还是错?错误!这是“未知”。

当一个或多个操作数为“未知”时,几乎所有逻辑运算符都会产生“未知”。处理查询时,“unknown”被视为 not-True,因此它在功能上等同于 wherewhen 条件中的 false。

类似地,NOT “unknown value” 的计算结果为 。 。 。 “未知”。

此规则的两个重要异常(exception)是 IS NULLIS NOT NULL。第一个计算结果为 true,第二个计算结果为 false。

一些数据库提供NULL安全比较(例如,Postgres提供IS DISTINCT FROM),它将NULL = NULL视为true。 SQL Server 不提供这样的显式运算符。当您有想要检查 NULL 的逻辑并且您还希望优化器使用索引时,NULL-safe 运算符会很方便。

关于sql - 否定sql中的 "unknown"值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40207957/

相关文章:

MySQL 在字符串中移动,在逗号之前和之后

sql - 只显示有 MOrderNo 的子订单号

sql - 将 SQL 查询转换为关系代数

sql - 计算与日期不同的月份 SQL SERVER

mysql - sql合并成格以选择案例

java - 如何从指定位置获取附件并将​​其存储到文件系统?

sql - WHERE(一组条件)OR(一组第二个条件)OR ...优雅地写

sql - 如何从 sql 中的临时 #date 表中选择之前的日期?

SQL Server 2016 - 动态数据屏蔽 (DDM)

t-sql - SqlDataReader 执行 SQL 比 Management Studio 执行 SQL 更快