跟别的RDBMS系统一样,Oracle中的空值(nulls)也应该被特殊对待。在Oracle中,有3个(也许更多?)函数可以用来处理空值,NVL, NVL2 和 COALESCE。我想要问你们一个问题,但是首先我自己得先温习一下。
NVL ( expr1 , expr2 )
如果expr1是空,那么NVL返回expr2。如果expr1不是空,那么NVL返回expr1。
NVL2 ( expr1 , expr2 , expr3 )
如果expr1是空,那么NVL2返回expr3。如果expr1不是空,那么NVL返回expr2。
COALESCE(expr[,expr]…)
返回参数列表中的第一个非空值。
当然我也可以使用CASE或者DECODE函数来处理空值。
下面左右的查询都返回相同的结果:
使用NVL:
- HR@XE> select nvl(commission_pct,0)
- 2 from employees
- 3 where commission_pct is null
- 4 and rownum = 1;
- NVL(COMMISSION_PCT,0)
- ---------------------
- 0
使用NVL2:
- HR@XE> select nvl2(commission_pct,commission_pct,0)
- 2 from employees
- 3 where commission_pct is null
- 4 and rownum = 1;
- NVL2(COMMISSION_PCT,COMMISSION_PCT,0)
- -------------------------------------
- 0
使用COALESCE:
- HR@XE> select COALESCE(commission_pct,0)
- 2 from employees
- 3 where commission_pct is null
- 4 and rownum = 1;
- COALESCE(COMMISSION_PCT,0)
- --------------------------
- 0
使用CASE:
- HR@XE> select
- 2 case
- 3 when commission_pct is null then 0
- 4 else commission_pct
- 5 end commission_pct
- 6 from employees
- 7 where commission_pct is null
- 8 and rownum = 1;
- COMMISSION_PCT
- --------------
- 0
使用DECODE:
- HR@XE> select
- 2 decode(commission_pct,null, 0,
- 3 commission_pct) commission_pct
- 4 from employees
- 5 where commission_pct is null
- 6 and rownum = 1;
- COMMISSION_PCT
- --------------
- 0
我通常都是使用NVL函数来检查空值的,但是,看上去COALESCE函数更加普遍(可以检查多个参数)并且COALESCE是一个所有关系型数据库系统都支持的标准函数。
那么是不是我该改变一下自己使用NVL的习惯转而使用COALESCE呢?各位有什么建议?
[@more@]来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11990/viewspace-830534/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/11990/viewspace-830534/