如果发生NULL,则拒绝行的条款

时间:2013-07-03 07:35:08

标签: sql sql-server sql-server-2008 null isnull

理论问题......

当触发下面给出的一组查询时......

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

...给出...

Actual Result

我在A.C1 <> B.C1子句中使用了Where

<小时/> 但我希望...

enter image description here

要将预期结果作为输出,我需要在ISNULL(A.C1,'') <> ISNULL(B.C1,'')子句中使用Where

我的问题是为什么每次都需要使用ISNULL来获得预期的输出,因为NULL不等于任何字符串数据。

1 个答案:

答案 0 :(得分:4)

来自here的引用是完美的:

  

理解NULL的正确方法是它不是一个值。不   “这是一个NULL值”,但“这个NULL不是一个值。”一切   要么是价值,要么不是。当某个东西是值时,它是“1”,   或“你好”,“绿色”或“5.00美元”等 - 但是当某些事情不是   价值,它根本不是什么。 SQL代表“这没有   值“由特殊的非值NULL组成。当有人说“NULL   价值,“人们应该在精神上不同意,因为没有这样的事情。   NULL是完全的,完全没有任何值。

Null不等于任何东西,因此比较总是失败。

例如,尝试此查询:

select *
from Temp2 B
where B.C1 = null 

它不会返回任何行!

句柄为空,您必须使用is nullis 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的查询返回的值完全相同的值。