2

(NULL = NULL)的。美好的。记住“NULL被定义为不等于任何东西”。

(NULL = NULL)的。呃……好吧,很公平。记住“NULL 代表一个未定义的值,所以你永远不知道它是否等于其他值”。

NOT(NULL = NULL)的。等等,什么!?

说真的,这怎么可能有效?“NOT()”运算符的行为如何取决于正在评估的表达式的详细信息!?所有的 SQL 系统都这样做吗?


演示查询:

SELECT '"1 & 1"',
       '"1 = 1" is ' + (CASE WHEN (1=1) THEN 'true' ELSE 'false' END) AS 'a=b',
       '"1 <> 1" is ' + (CASE WHEN (1<>1) THEN 'true' ELSE 'false' END) AS 'a<>b',
       '"NOT(1=1)" is ' + (CASE WHEN NOT(1=1) THEN 'true' ELSE 'false' END) AS 'NOT(a=b)',
       '"NOT(1<>1)" is ' + (CASE WHEN NOT(1<>1) THEN 'true' ELSE 'false' END) AS 'NOT(a<>b)'
UNION
SELECT '"1 & 2"',
       '"1 = 2" is ' + (CASE WHEN (1=2) THEN 'true' ELSE 'false' END)AS 'a=b',
       '"1 <> 2" is ' + (CASE WHEN (1<>2) THEN 'true' ELSE 'false' END)AS 'a<>b',
       '"NOT(1=2)" is ' + (CASE WHEN NOT(1=2) THEN 'true' ELSE 'false' END)AS 'NOT(a=b)',
       '"NOT(1<>2)" is ' + (CASE WHEN NOT(1<>2) THEN 'true' ELSE 'false' END) AS 'NOT(a<>b)'
UNION
SELECT '"NULL & 1"',
       '"NULL = 1" is ' + (CASE WHEN (NULL=1) THEN 'true' ELSE 'false' END) AS 'a=b',
       '"NULL <> 1" is ' + (CASE WHEN (NULL<>1) THEN 'true' ELSE 'false' END) AS 'a<>b',
       '"NOT(NULL=1)" is ' + (CASE WHEN NOT(NULL=1) THEN 'true' ELSE 'false' END) AS 'NOT(a=b)',
       '"NOT(NULL<>1)" is ' + (CASE WHEN NOT(NULL<>1) THEN 'true' ELSE 'false' END) AS 'NOT(a<>b)'
UNION
SELECT '"NULL & NULL"',
       '"NULL = NULL" is ' + (CASE WHEN (NULL=NULL) THEN 'true' ELSE 'false' END)AS 'a=b',
       '"NULL <> NULL" is ' + (CASE WHEN (NULL<>NULL) THEN 'true' ELSE 'false' END)AS 'a<>b',
       '"NOT(NULL=NULL)" is ' + (CASE WHEN NOT(NULL=NULL) THEN 'true' ELSE 'false' END)AS 'NOT(a=b)',
       '"NOT(NULL<>NULL)" is ' + (CASE WHEN NOT(NULL<>NULL) THEN 'true' ELSE 'false' END) AS 'NOT(a<>b)'
4

2 回答 2

7

值逻辑 (3VL)将逻辑运算符定义为:

+---------+---------+---------+---------+---------+
| p       | q       | p OR q  | p AND q | p = q   |
+---------+---------+---------+---------+---------+
| True    | Unknown | True    | Unknown | Unknown |
| False   | Unknown | Unknown | False   | Unknown |
| Unknown | True    | True    | Unknown | Unknown |
| Unknown | False   | Unknown | False   | Unknown |
| Unknown | Unknown | Unknown | Unknown | Unknown |
+---------+---------+---------+---------+---------+

NOT行为具有以下真值表:

+---------+---------+
| p       | NOT p   |
+---------+---------+
| True    | False   |
| False   | True    |
| Unknown | Unknown |
+---------+---------+

所以,在表达式NOT(NULL = NULL)中,你得到:

NULL = NULL -> Unknown
NOT(Unknown) -> Unknown

您的案例条件总是表现得像未满足,因为您的表达式计算结果为 Unknown,即既不是 true 也不是 false

有关 SQL Server 关于空值的工作方式的更多信息,请查看为什么 NULL = NULL 在 SQL Server 中评估为 false

于 2017-04-10T10:59:38.623 回答
0

原因是它NULL表示没有值或未知值。SQL 在选择其中一种含义时并不一致,但在大多数情况下,它的NULL行为就像一个未知值。

NULL = NULL返回NULL,因为如果比较两个未知值,结果是未知的。它们可能相同或不同。

有办法处理NULL。最常见的是IS NULLIS NOT NULL语法。但是您也可以以安全的NULL方式比较两个值。在这种情况下,要使用的语法取决于您使用的 DBMS。更多细节在这里

于 2019-03-22T00:29:32.887 回答