2011-06-17 83 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)总是垫空间