今天有同事问我sum函数 null值的问题。只记得在分析求和的时候是不计算null值(Oracle中的组函数忽略空值),其它的到没有深入了解过。乘此良机
,稍微研究下,记录之~
以下出自《oracle 9i&10g 编程艺术》
SQL 采用一种三值逻辑来操作,Oracle 则是按ANSI SQL 的要求来实现NULL 值。基于这些规则的要求,x 与NULL 的比较结果既不为true 也不为false,也就是说,实际上,它是未知的(unknown)。
select * from dual where null=null;
no rows selected
select * from dual where null <> null;
no rows selected
select * from dual where null is null;
D
-
X
在Oracle 中,NULL 与NULL 既不相等,也不完全不相等。默认情况下,SQL Server 则不是这样处理;在SQL Server 和Sybase 中,NULL 就等于NULL。不能
说Oracle 的SQL 处理是错的,也不能说Sybase 或SQL Server 的处理不对,它们只是方式不同罢了。
实际上,所有这些数据库都符合ANSI,但是它们的具体做法还是有差异。有许多二义性、向后兼容性等问题需要解决。例如, SQL Server 也支持ANSI 方法的NULL 比较,但这不是默认的方式(如果改成ANSI 方法的NULL 比较,基于SQL Server 构建的数千个遗留应用就会出问题)。
继续我的实验
z@test10gr2> select sum(null) from dual;
SUM(NULL)
----------
z@test10gr2> select sum(null+33) from dual;SUM(NULL+33)
------------下面是确认一下上面的那个确实是空值
z@test10gr2> select nvl(sum(null+33),99999) from dual;NVL(SUM(NULL+33),99999)
-----------------------
99999z@test10gr2> select sum(null+null) from dual;
SUM(NULL+NULL)
--------------下面是确认一下上面的那个确实是空值
z@test10gr2> select nvl(sum(null+null),9999) from dual;NVL(SUM(NULL+NULL),9999)
------------------------
9999
下面建立一张表,再进行测试。
z@test10gr2> create table t_null(a number);
Table created.
z@test10gr2> insert into t_null values(null);
1 row created.
z@test10gr2> insert into t_null values(null);
1 row created.
z@test10gr2> insert into t_null values(null);
1 row created.
z@test10gr2> select rownum,a from t_null;
ROWNUM A
---------- ----------
1
2
3z@test10gr2> select sum(a) from t_null;
SUM(A)
----------下面是确认一下上面的那个确实是空值
z@test10gr2> select nvl(sum(a),0) from t_null;NVL(SUM(A),0)
-------------
0
当全部是空值的时候,sum的结果也为空。
z@test10gr2> insert into t_null values(77);
1 row created.
z@test10gr2> select rownum,a from t_null;
ROWNUM A
---------- ----------
1
2
3
4 77z@test10gr2> select sum(a) from t_null;
SUM(A)
----------
77
正如之前所说,组函数不计算null值。
z@test10gr2>select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
PL/SQL Release 10.2.0.5.0 - Production
CORE 10.2.0.5.0 Production
TNS for Linux: Version 10.2.0.5.0 - Production
NLSRTL Version 10.2.0.5.0 - Production
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/23650854/viewspace-684335/ ,如需转载,请注明出处,否则将追究法律责任。