我目前正在学习SQL Server,学习了这本书" T-SQL Fundamentals Third Edition"。在书中,有以下引用:
逻辑值“未知”的一个棘手方面是当你 否定它,你仍然得到“未知”。例如,给定谓词 “不是(工资> 0)”,当工资为“null”时,“工资> 0“评估为 “未知”和“未知”仍为“未知”
我对声明背后的所有逻辑感到有些困惑,只是想知道是否有人会澄清一点事情?
有人还会添加代码示例吗?
答案 0 :(得分:2)
让我们试着解释一下。 NULL
表示“未知”值(尽管在实践中,它通常代表缺少值)。
当你有一个诸如“salary> 0”的表达式时,解释是“未知值”> 0“。这是真还是假?错了!这是”未知“。
当一个或多个操作数“未知”时,几乎所有逻辑运算符都会产生“未知”。处理查询时,“unknown”被视为not-True,因此在where
或when
条件下,它在功能上等同于false。
同样,NOT "unknown value"
评估为。 。 。 “未知”。
此规则的两个重要例外是IS NULL
和IS NOT NULL
。第一个评估为真,第二个评估为假。
某些数据库提供NULL-safe
次比较(例如,Postgres提供IS DISTINCT FROM
),将NULL = NULL
视为真。 SQL Server不提供这样的显式运算符。当你有想要检查NULL-safe
的逻辑并且你也希望优化器使用索引时,NULL
运算符可以很方便。
答案 1 :(得分:1)
来自https://msdn.microsoft.com/en-us/library/mt204037.aspx
NULL表示该值未知。空值与空值或零值不同。没有两个空值相等。两个空值之间或空值与任何其他值之间的比较返回未知,因为每个NULL的值都是未知的。
使用NULL值正常工作,使用" IS NULL",你不能用任何东西比较NULL值,因为它总是满足contidition(即(NULL值< 0)为真,并且( NULL值> 0)为真)
答案 2 :(得分:0)
"未知"是两个操作数的结果。操作数可以是NULL。
简单的术语
NULL是操作数。
未知不是操作数
未知可能是两个操作数的结果
请参阅以下链接。很少有表格可以给出泥潭的细节差异。 https://msdn.microsoft.com/en-us/library/mt204037.aspx