5

一个理论问题...

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

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不等于任何字符串数据。

4

1 回答 1

4

这里的引用是完美的:

理解 NULL 的正确方法是它不是一个值。不是“这是一个 NULL 值”,而是“这个 NULL 不是一个值”。一切要么是价值,要么不是。当某物是价值时,它是“1”或“你好”或“绿色”或“$5.00”等——但当某物不是价值时,它根本就不是任何东西。SQL 用特殊的非值 NULL 表示“this has no value”。当有人说“NULL 值”时,人们应该在精神上不同意,因为没有这样的东西。NULL 是完全的,完全没有任何值。

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

例如试试这个查询:

select *
from Temp2 B
where B.C1 = null 

它不会返回任何行!

您必须使用的句柄空值is nullor 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

于 2013-07-03T07:47:54.870 回答