Informix SQL - 简单选择查询返回意外结果
Posted
技术标签:
【中文标题】Informix SQL - 简单选择查询返回意外结果【英文标题】:Informix SQL - Simple select query is returning unexpected results 【发布时间】:2011-06-17 19:15:01 【问题描述】:按照这个,真的很明显很简单。出于某种原因,数据子集的查询和接近角度之间的结果不同。请记住,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 语句中的空白值?它在使用分组的第一个查询中发现它很好,但没有其他地方。
有没有人知道为什么会发生这种事情?
【问题讨论】:
【参考方案1】:NULLs
需要在 SQL 中进行特殊处理。
试试
select count(*)
from id_rec
where correct_addr <> 'N'
or correct_addr is null;
See here for an explanation of handling NULLs.
【讨论】:
谢谢...我不知道correct_addr is null
和 correct_addr in (null)
被区别对待【参考方案2】:
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(column) 将忽略 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) 将始终填充到空格
【讨论】:
以上是关于Informix SQL - 简单选择查询返回意外结果的主要内容,如果未能解决你的问题,请参考以下文章