Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1703213
  • 博文数量: 136
  • 博客积分: 10021
  • 博客等级: 上将
  • 技术积分: 3261
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-22 11:26
文章分类

全部博文(136)

文章存档

2010年(1)

2009年(26)

2008年(109)

我的朋友

分类: Oracle

2008-06-17 10:54:43

我们的应用程序经常会做一些报表。SUM 函数和 NVL 函数在 SQL 中经常被一起使用,以保证数据的准确。今天发现一个小问题:
 
SQL> create table test_yct(a number);
 
表已创建。
 
SQL> select sum(nvl(a, 0)) from test_yct;
 
SUM(NVL(A,0))
-------------
 

SQL> select nvl(sum(a), 0) from test_yct;
 
NVL(SUM(A),0)
-------------
            0
 
只是位置的调换,查询结果便不同。而在能查询出记录的情况下,这两个 SQL 的执行结果是一样的:
 
SQL> insert into test_yct values( null );
 
已创建 1 行。
 
SQL> commit;
 
提交完成。
 
SQL> select sum(nvl(a, 0)) from test_yct;
 
SUM(NVL(A,0))
-------------
            0
 
SQL> select nvl(sum(a), 0) from test_yct;
 
NVL(SUM(A),0)
-------------
            0
 
有时候,我们编写的 SQL 会查询不到结果,这时就需要注意这种情况了。 对于 SUM 的判断结果,再加上一个 NVL 判断就可以了:
 
SQL> truncate table test_yct;
 
表已截掉。
 
SQL> select sum(nvl(a, 0)) from test_yct;
 
SUM(NVL(A,0))
-------------
 

SQL> select nvl(sum(nvl(a, 0)), 0) from test_yct;
 
NVL(SUM(NVL(A,0)),0)
--------------------
                   0
 
不是什么大问题,只要足够细心就能发现,并且在编写 SQL 的时候注意到。
阅读(2869) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-03-23 12:45:51

这个我还真没注意到

yaoronghui20082008-06-18 21:48:41

这个问题我也遇到过,分析需要加深对null对于不同函数的作用范围的理解