关于NVL函数的一个细节问题
一、准备工作:创建一个表并插入测试数据
SQL> create table t0720 (a VARCHAR2(2) ,
2 b NUMBER(12,2)
3 )
4 /
表已创建
SQL> INSERT INTO t0720 VALUES ('B',NULL)
2 /
已创建一行
SQL> COMMIT
2 /
提交完成
SQL> SELECT * FROM t0720
2 /
A B
-- ---------
B
SQL>
二、一个问题
SELECT NVL(B,0) FROM t0720 WHERE a = 'B' 与
SELECT NVL(B,0) FROM t0720 WHERE a = 'X' 的返回值是否都为零?
回答是否定的。语句执行结果如下:
SQL> SELECT NVL(B,0) FROM t0720 WHERE a = 'B'
2 /
NVL(B,0)
---------
0
SQL> SELECT NVL(B,0) FROM t0720 WHERE a = 'X'
2 /
未选定行
三、结论
在SQL中使用NVL函数时,若根本就没有满足条件的数据记录返回时,NVL将不进行处理,或者说此时根本无数据可供NVL函数处理。
四、应用举例
SQL> SELECT SUM(NVL(B,0)) FROM t0720 WHERE a = 'X'
2 /
/*由于无满足条件的数据返回,NVL未做处理。故返回NULL值*/
SUM(NVL(B,0))
-------------
SQL> SELECT NVL(SUM(B) ,0) FROM t0720 WHERE a = 'X'
2 /
/*虽然根据查询条件无满足条件的数据返回,但根据SUM函数的特点
最终将返回NULL值,而此值被NVL函数捕获并被处理,故返回0值。*/
NVL(SUM(B),0)
-------------
0
SQL>
小结:若想达到无数据则SUM返回0值的目的,则应把NVL放在外层而不是里层。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10595277/viewspace-408736/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10595277/viewspace-408736/