2011-04-29 121 views
2

的问题我有一个表,其中包含一个名为status的type smallint的列,并接受null。 SQL Server 2000.比较smallint where where子句

我的数据在该字段中包含大部分2,但也包含0和null。

当我做

select * 
from table 
where status <> 2 

我没有得到所有适当的记录(其中状态为空或0)。任何想法为什么发生这种情况以及如何纠正? <>除了2以外还能给我什么?

回答

1
select * 
from table 
where ISNULL(status, 1) <> 2 

NULL doesn't compare:因此将其删除。

你举的例子是“常识性错误”上Wikipedia太...

+0

所以我感到很蠢,直到我看到人们抱怨它如何工作的“批评”部分。不过,不知道我是如何错过那个条目的...... – MAW74656 2011-04-29 16:33:47

+0

这个NULL值只是* *。我有更好的事情要抱怨:-) – gbn 2011-04-29 16:35:38

2

NULL测试不匹配任何算术比较。

使用

where status <> 2 OR status is null 
+0

真的吗?所以声明:2 <> null是假的?为什么会发生? – MAW74656 2011-04-29 16:23:21

+1

因为NULL不是放在字段中的值。这是关于该领域的状态条件,存储在别处。 – wallyk 2011-04-29 16:25:11

+0

好的,它的工作原理。但从数学的角度来看,它非常混乱。 2和null(什么都不是)是不一样的。 – MAW74656 2011-04-29 16:26:17

1

你期待什么可以ANSI_NULLS设置为关闭来实现。

例如,尝试运行这些查询:

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行为。因为每个开发人员都会期望这种类型的SQL查询行为,所以无论是否等于比较,NULL比较始终应被视为false。

你的WHERE子句应该再像:

where status <> 2 or status is null 

另一种选择是只是为了比较状态= 1,如果这就是你希望要包含在您的查询的唯一状态。