Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
否定;“未知”;sql中的值_Sql_Sql Server_Tsql - Fatal编程技术网

否定;“未知”;sql中的值

否定;“未知”;sql中的值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我目前正在通过学习《T-SQL基础知识第三版》一书来学习SQL Server。书中有以下引文: 逻辑值“未知”的一个棘手方面是 否定它,你仍然会得到“未知”。例如,给定谓词 “不是(薪资>0)”,当薪资为“空”时,“薪资>0”的计算结果为 “未知”和“未知”仍然是“未知” 我对这句话背后的逻辑有点困惑,只是想知道是否有人能澄清一下 有人还会添加代码示例吗?未知”是两个操作数的结果。并且操作数可以是NULL 简单术语 空值是操作数。 未知不是操作数 未知可能是两个操作数的结果 请参考下面的链接。很

我目前正在通过学习《T-SQL基础知识第三版》一书来学习SQL Server。书中有以下引文:

逻辑值“未知”的一个棘手方面是 否定它,你仍然会得到“未知”。例如,给定谓词 “不是(薪资>0)”,当薪资为“空”时,“薪资>0”的计算结果为 “未知”和“未知”仍然是“未知”

我对这句话背后的逻辑有点困惑,只是想知道是否有人能澄清一下

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

未知”是两个操作数的结果。并且操作数可以是NULL

简单术语

空值是操作数。

未知不是操作数

未知可能是两个操作数的结果

请参考下面的链接。很少有表格能给出详细的区别。 来自

NULL表示该值未知。空值与空值或零值不同。没有两个空值相等。两个空值之间或空值与任何其他值之间的比较返回unknown,因为每个空值的值都是未知的


要正确处理空值,请使用“IS NULL”,您不能将空值与任何值进行比较,因为它始终满足以下条件(即,(NULL值<0)为true,(NULL值>0)为true)

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

当您有一个表达式如“工资>0”时,解释为“未知值”>0。这是对的还是错的?错!这是“未知”

当一个或多个操作数为“未知”时,几乎所有逻辑运算符都会生成“未知”。在处理查询时,“未知”被视为非真,因此在
where
when
条件下,它在功能上等同于false

类似地,
非“未知值”
的计算结果为…“未知”

此规则的两个重要例外是
为空
不为空
。第一个计算结果为真,第二个计算结果为假


一些数据库提供了
NULL-safe
比较(例如,Postgres提供的
不同于
),它将
NULL=NULL
视为true。SQL Server不提供此类显式运算符。
NULL-safe
运算符可以在逻辑上方便地检查
NULL
s,并且希望优化器使用索引。

只需创建一个包含一些正值、负值和NULL值的测试表。然后运行
SELECT…WHERE v>0
SELECT…WHERE NOT(v>0)
。您将看到它是如何工作的。在这两种变体中,您的空值都不会被选择。这是一个措辞非常糟糕的示例。如果“salary>0”的计算结果为“unknown”,那么“notunknown”将是“known”“…@VladimirBaranov你的评论帮助我理解了这个概念!非常感谢你@zlk这也不是书上说的。