2011-06-17 126 views
1

按照這個,它非常明顯而且簡單。出於某種原因,結果在數據子集上的查詢和接近角度之間不同。請記住,該字段correct_addr是一個帶有允許空值的char(1)字段。Informix SQL - 簡單選擇查詢返回意外結果

select distinct correct_addr, count(*) from id_rec group by correct_addr; 

correct_addr  (count(*)) 
         2477 
N       80 
Y      84013 

3 row(s) retrieved. 

好了,correct_addr包含3倍不同的值: 「N」, 「Y」 和 「」 或 「」 或NULL

所以,現在,我試試這個:

select count(*) from id_rec where correct_addr <> 'N'; 

     (count(*)) 
      84013 

有那個空白值的2477記錄發生了什麼?

另一個從不同的角度嘗試:

select count(*) from id_rec where correct_addr in (null,'',' ','Y'); 

     (count(*)) 
      84013 

同樣的事情發生....

那麼,什麼是怎麼回事?爲什麼sql引擎(?)不能識別最後2個sql語句中的空白值?它在分組的第一個查詢中發現它很好,但沒有其他地方。

有沒有人有任何想法,爲什麼會發生這種類型的事情?

回答

0

NULL比較總是錯誤的。而空字符串或單個空格是一個不爲NULL的值。

但是,GROUP BY會識別它並對其進行計數。

嘗試這些

select count(*) from id_rec 
where correct_addr <> 'N' or correct_addr IS NULL 

select count(*) from id_rec 
where COALESCE(correct_addr, 'X') <> 'N' 


select count(*) from id_rec 
where COALESCE(correct_addr, ' ') in (' ','Y'); 

此外,COUNT(列)會忽略空值,因此一些嘗試

select count(correct_addr), COUNT(*) from id_rec GROUP BY correct_addr 

select count(correct_addr), COUNT(*) from id_rec 
where correct_addr <> 'N' or correct_addr IS NULL 

注:CHAR(1)總是墊空間