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 nullcorrect_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 - 简单选择查询返回意外结果的主要内容,如果未能解决你的问题,请参考以下文章

IBM Informix SQL 中的 LIKE

在 Informix SQL 中选择 null [重复]

Informix 查询慢

informix数据库分页

informix数据库分页

SQL子查询返回奇怪的结果