一尘不染

如果出现NULL的情况,子句拒绝行

sql

一个理论问题…

当触发以下给出的一组查询时,则…

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.C1Where子句中使用过。


但是我希望…

在此处输入图片说明

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

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


阅读 128

收藏
2021-05-23

共1个答案

一尘不染

这里引用是完美的:

理解NULL的正确方法是它不是一个值。不是“他的值是NULL值”,而是“他的NULL值不是值。”所有东西都是值,或者不是。当某物是价值时,它是“
1”,“”,“鈥”或“ $
5.00”等,但是当某物不是“值时,它就是”。檛什么都没有。SQL通过特殊的非值NULL表示``他没有值’‘。当有人说“他的NULL值”时,应该在精神上不同意,因为没有这样的事情。NULL表示完全不存在任何值。

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

例如,尝试以下查询:

select *
from Temp2 B
where B.C1 = null

它不会返回任何行!

必须使用is null或的句柄为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返回的值完全相同的值。

2021-05-23