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.C1在Where条款中使用过.

要获得预期结果作为输出,我需要ISNULL(A.C1,'') <> ISNULL(B.C1,'')在该Where子句中使用.
我的问题是为什么我需要ISNULL每次都按预期使用输出,因为NULL它不等于任何字符串数据.
引用自从这里是完美的:
\n\n\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
Null 不等于任何东西,因此比较总是失败。
\n\n例如尝试这个查询:
\n\nselect *\nfrom Temp2 B\nwhere B.C1 = null \nRun Code Online (Sandbox Code Playgroud)\n\n它不会返回任何行!
\n\n您必须使用的句柄为空is null或is not null:
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)\nRun Code Online (Sandbox Code Playgroud)\n\n返回与您的查询完全相同的值ISNULL。