2011-04-29 150 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,如果這就是你希望要包含在您的查詢的唯一狀態。