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

Rom*_*esh 5 sql sql-server null isnull sql-server-2008

理论问题......

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

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
Run Code Online (Sandbox Code Playgroud)

...给...

实际结果

A.C1 <> B.C1Where条款中使用过.


但我希望......

在此输入图像描述

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

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

gza*_*axx 4

引用自从这里是完美的:

\n\n
\n

理解 NULL 的正确方法是它不是一个值。不是\n \xe2\x80\x9c这是一个NULL值\xe2\x80\x9d但\xe2\x80\x9c这个NULL不是一个值。\xe2\x80\x9d一切\n要么是一个值,要么不是\ xe2\x80\x99t。当某个东西是一个值时,它是 \xe2\x80\x9c1,\xe2\x80\x9d\n 或 \xe2\x80\x9chello,\xe2\x80\x9d 或 \xe2\x80\x9cgreen,\xe2\x80\ x9d 或 \xe2\x80\x9c$5.00\xe2\x80\xb3 等 \xe2\x80\x94 但当某些东西不是 \xe2\x80\x99t 一个\n 值时,它根本就不是 \xe2\x80\x99 任何东西。SQL 通过特殊的非值 NULL 表示 \xe2\x80\x9cthis 没有值\xe2\x80\x9d。当有人说 \xe2\x80\x9c NULL\n 值时,\xe2\x80\x9d 应该在心理上不同意,因为 \xe2\x80\x99 不存在这样的东西。\n NULL 是完全、完全不存在任何值。

\n
\n\n

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

\n\n

例如尝试这个查询:

\n\n
select *\nfrom Temp2 B\nwhere B.C1 = null \n
Run Code Online (Sandbox Code Playgroud)\n\n

它不会返回任何行!

\n\n

您必须使用的句柄为空is nullis not null

\n\n
select *\nfrom Temp1 A, Temp2 B\nwhere 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)\n
Run Code Online (Sandbox Code Playgroud)\n\n

返回与您的查询完全相同的值ISNULL

\n