我有一个名为smallint类型的列的表,并且接受null。 Sql server 2000。
我的数据在该字段中主要包含2个,但也包含0和null。
当我这样做时
select *
from table
where status <> 2
我没有得到所有正确的记录(状态为null或0)。知道为什么会这样,以及如何纠正?不应该&lt;&gt;给我除了2之外的所有东西?
答案 0 :(得分:2)
NULL测试与任何算术比较都不匹配。
使用
where status <> 2 OR status is null
答案 1 :(得分:1)
select *
from table
where ISNULL(status, 1) <> 2
NULL doesn't compare:删除它。
你的例子也是Wikipedia上的“常见错误”......
答案 2 :(得分:1)
您可以通过将ANSI_NULLS设置为off来实现您的期望。
例如,尝试运行这些查询:
set ansi_nulls off
select case when 1 != null then 'true' else 'false' end
set ansi_nulls on
select case when 1 != null then 'true' else 'false' end
话虽这么说,这是你期望看到的非标准的SQL行为。 NULL比较应始终被视为false,无论等于或不等于比较,因为每个开发人员都会期望这种类型的SQL查询行为。
您的WHERE子句应如下所示:
where status <> 2 or status is null
另一种选择只是与status = 1进行比较,如果这是您希望包含在查询中的唯一状态。