ORACLE的count与空值比较

简介:   今天,一同事问我,有个问题很奇怪,他写的SQL语句不统计null值,怎么一回事,看下面重现:  参与的实验数据: --创建测试表 create table mytab( col1 varchar2(10), col2 varchar2(10), col...
  今天,一同事问我,有个问题很奇怪,他写的SQL语句不统计null值,怎么一回事,看下面重现:
 参与的实验数据:
--创建测试表
create table mytab(
col1 varchar2(10),
col2 varchar2(10),
col3 varchar2(10)
);
--插入测试数据
insert into mytab values ('10010','b1','c1');
insert into mytab values ('10011','b2','c2');
insert into mytab values ('10012','b3','c3');
insert into mytab values ('10012','b4','c4');
insert into mytab values ('10012','b4','c5');
insert into mytab values ('10012','b4','c6');
insert into mytab values ('10013','','');
insert into mytab values ('10013','','c7');
insert into mytab values ('10012','','c9');
insert into mytab values ('10012','b9','');

 --同事觉得奇怪的SQL语句及执行结果:
select 'A' as "编号", count(*) from mytab
union
select 'B' as "编号",count(*) from mytab where col2 in('b4','b3')
union 
select 'C' as "编号",count(*) from mytab where col2 not in('b4','b3') 
union 
select 'D' as "编号",count(*) from mytab where col2 is null;
查询结果:
  编号 COUNT(*)
  A     10
  B     4
  C     3
  D     3
 同事觉得编号为C的统计值,应该包含编号为D的统计值,但是,为什么编号C没有包括编号D的值呢?
其实,很简单:
select 'C' as "编号",count(*) from mytab where col2 not in('b4','b3')
union 
select 'H' as "编号",count(*) from mytab where col2 != 'b4' and col2 !='b3'
union
select 'I' as "编号",count(*) from mytab where col2 not in('b4','b3') or col2 is null; 
编号 COUNT(*)
 C   3
 H   3
 I    6
编号为C的SQL与编号为H的SQL等价,所以C、H的查询结果也相同,从编号为I的查询结果,我们就能发现问题在哪,
就是涉及null的比较,正确方法是:null比较相等用is,比较不等用is not,而不能用=或<>,否则统计将排除空值,有下列SQL语句为证:
select 'C' as "编号",count(*) from mytab where col2 not in('b4','b3') 
union 
select 'D' as "编号",count(*) from mytab where col2 is null
union
select 'E' as "编号", count(*) from mytab where col2 is not null
union
select 'G' as "编号",count(*) from mytab where col2 = null
union
select 'H' as "编号",count(*) from mytab where col2 <> null
union
select 'I' as "编号",count(*) from mytab where col2 not in('b4','b3') or col2 is null; 
编号 COUNT(*)
 C   3
 D   3
 E   7
 G   0
 H   0
 I    6
编号为G和编号为H的查询结果说明null值使用=或<>进行统计时永远都为0,只有is 或is not才能统计Null值列名,这是个陷阱。
我想起了,自己JAVA面试的时候,经理就问了这么一个问题,就是涉及空值的where条件语句怎么写,答案的关键就是要用is 或
is not进行空值比较。






目录
相关文章
|
4天前
|
SQL Oracle 关系型数据库
Oracle之如何处理空值
Oracle之如何处理空值
63 0
|
4天前
|
SQL Oracle 关系型数据库
Oracle之not in中不能存在空值
Oracle之not in中不能存在空值
91 1
|
运维 Oracle 关系型数据库
Oracle: count STOPKEY 优化
Oracle数据库中select * from test where id> 1000 and rownum=1这样的语句应该怎样优化
461 0
|
Oracle Java 关系型数据库
Oracle数据库mybatis 插入空值时报错(with JdbcType OTHER)的两种解决方案
Oracle数据库mybatis 插入空值时报错(with JdbcType OTHER)的两种解决方案
445 0
|
Oracle 关系型数据库 Java
在使用MyBatis连接Oracle进行查询时遇到查询结果集不为空, 某些字段空值情况
在使用MyBatis连接Oracle进行查询时,出现运行结果正常,但是名字取值为空的情况
在使用MyBatis连接Oracle进行查询时遇到查询结果集不为空, 某些字段空值情况
|
Oracle 关系型数据库 MySQL
Mysql,Oracle中 sum、count函数使用条件判断
Mysql,Oracle中 sum、count函数使用条件判断
Mysql,Oracle中 sum、count函数使用条件判断
|
SQL Oracle 关系型数据库
ORACLE参数max_shared_servers空值与零的区别
ORACLE数据库中的参数max_shared_servers,这是一个DBA很熟悉的参数,但是这个参数max_shared_servers为空值与为0有区别吗?这个细节可能很多人都没有注意过。如下所示:     SQL> show parameter max_shared_servers  ...
1061 0
|
SQL Oracle 关系型数据库