请查看以下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脚本有什么问题?
答案 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