遵循这一点,它非常明显和简单。由于某种原因,结果在数据子集上的查询和接近角度之间不同。请注意,字段correct_addr
是char(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语句中的空白值?它在使用分组的第一个查询中发现它很好,但在其他任何地方都没有。
有没有人对这种事情发生的原因有任何想法?
答案 0 :(得分:3)
NULLs
需要在SQL中进行特殊处理。
尝试
select count(*)
from id_rec
where correct_addr <> 'N'
or correct_addr is null;
答案 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)将始终填充空格