麻烦比较where子句中的smallint

时间:2011-04-29 16:18:33

标签: sql tsql sql-server-2000

我有一个名为smallint类型的列的表,并且接受null。 Sql server 2000。

我的数据在该字段中主要包含2个,但也包含0和null。

当我这样做时

select *
from table
 where status <> 2

我没有得到所有正确的记录(状态为null或0)。知道为什么会这样,以及如何纠正?不应该&lt;&gt;给我除了2之外的所有东西?

3 个答案:

答案 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进行比较,如果这是您希望包含在查询中的唯一状态。