理论问题......
当触发下面给出的一组查询时......
Create table Temp1(C1 varchar(2))
Create table Temp2(C1 varchar(2))
insert into Temp1 Values('A'),(NULL),('B')
insert into Temp2 Values('B'),(NULL),('C'),(NULL)
select *from Temp1 A,Temp2 B
where A.C1 <> B.C1
...给出...
我在A.C1 <> B.C1
子句中使用了Where
。
要将预期结果作为输出,我需要在ISNULL(A.C1,'') <> ISNULL(B.C1,'')
子句中使用Where
。
我的问题是为什么每次都需要使用ISNULL
来获得预期的输出,因为NULL
不等于任何字符串数据。
答案 0 :(得分:4)
来自here的引用是完美的:
理解NULL的正确方法是它不是一个值。不 “这是一个NULL值”,但“这个NULL不是一个值。”一切 要么是价值,要么不是。当某个东西是值时,它是“1”, 或“你好”,“绿色”或“5.00美元”等 - 但是当某些事情不是 价值,它根本不是什么。 SQL代表“这没有 值“由特殊的非值NULL组成。当有人说“NULL 价值,“人们应该在精神上不同意,因为没有这样的事情。 NULL是完全的,完全没有任何值。
Null不等于任何东西,因此比较总是失败。
例如,尝试此查询:
select *
from Temp2 B
where B.C1 = null
它不会返回任何行!
句柄为空,您必须使用is null
或is not null
:
select *
from Temp1 A, Temp2 B
where A.C1 <> B.C1 or (A.C1 is null and B.C1 is not null) or (B.C1 is null and A.C1 is not null)
返回与ISNULL
的查询返回的值完全相同的值。