Informix SQL - 简单选择查询返回意外结果

时间:2011-06-17 19:15:02

标签: sql select informix

遵循这一点,它非常明显和简单。由于某种原因,结果在数据子集上的查询和接近角度之间不同。请注意,字段correct_addrchar(1)字段,允许空值。

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语句中的空白值?它在使用分组的第一个查询中发现它很好,但在其他任何地方都没有。

有没有人对这种事情发生的原因有任何想法?

2 个答案:

答案 0 :(得分:3)

NULLs需要在SQL中进行特殊处理。

尝试

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

See here for an explanation of handling NULLs

答案 1 :(得分:0)

NULL比较始终为false。空字符串或单个空格是一个非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(列)将忽略NULLS以便尝试更多

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)将始终填充空格