ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 实验 oracle sum null值相关

实验 oracle sum null值相关

原创 Linux操作系统 作者:zecaro 时间:2011-01-20 20:40:29 0 删除 编辑

        今天有同事问我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)
-----------------------
                  99999

z@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
         3

z@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         77

z@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博客 ” ,链接:http://blog.itpub.net/23650854/viewspace-684335/,如需转载,请注明出处,否则将追究法律责任。

下一篇: TX\TM锁
请登录后发表评论 登录
全部评论

注册时间:2010-10-28

  • 博文量
    182
  • 访问量
    356667