为什么不忽略null?

时间:2017-06-09 09:16:31

标签: sql

请查看以下tsql脚本

declare @t table(x varchar(50) null)
insert into @t values(null),('Y'),('N'),('WOFF')
select *
from @t t
where t.x not in ('WOFF')

输出

Y
N

但预计是

NULL
Y
N

sql脚本有什么问题?

5 个答案:

答案 0 :(得分:3)

您可能需要这样做:

declare @t table(x varchar(50) null)
insert into @t values(null),('Y'),('N'),('WOFF')
select *
from @t t
where t.x not in ('WOFF') or t.x is null

declare @t table(x varchar(50) null)
insert into @t values(null),('Y'),('N'),('WOFF')
select *
from @t t
where t.x not in ('WOFF') or t.x is not null

答案 1 :(得分:2)

因为在运行查询时会检查相等性,而WOFF是一个值,而null表示无值。 当然,无价值不能等于任何价值。

答案 2 :(得分:1)

NULL之外的所有条件都会忽略

IS NULL。类似于轮盘赌中的0:)

答案 3 :(得分:1)

我认为null被正式指定为“未知值”这意味着您无法通过常规的真假检查来解决它。

在您的示例中,您想知道哪些值不是woff。就编译器而言,null为unknown它可能是woff或者它不可能是woff,不幸的是它不能证明任何一种方式因此被编程为忽略它 - 最好不小心遗漏了一个潜在的正确的答案,而不是返回可能不正确的anser。

因此,您需要包含特定的检查,例如值is null或值is not null,如其他答案所示。然后,这会更改您的语句,以返回所有非woff或未知的值

答案 4 :(得分:0)

使用以下查询:

 SELECT CASE WHEN x = 'Y' THEN 'Y' WHEN x = 'N' THEN 'N' END
 FROM @t t
 WHERE t.x NOT IN ('WOFF') OR t.x IS NULL