NVL, NVL2 or COALESCE?(貼在這邊。供自己參考)

跟别的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:

  1. HR@XE> select nvl(commission_pct,0)
  2. 2 from employees
  3. 3 where commission_pct is null
  4. 4 and rownum = 1;
  5. NVL(COMMISSION_PCT,0)
  6. ---------------------
  7. 0

使用NVL2:

  1. HR@XE> select nvl2(commission_pct,commission_pct,0)
  2. 2 from employees
  3. 3 where commission_pct is null
  4. 4 and rownum = 1;
  5. NVL2(COMMISSION_PCT,COMMISSION_PCT,0)
  6. -------------------------------------
  7. 0

使用COALESCE:

  1. HR@XE> select COALESCE(commission_pct,0)
  2. 2 from employees
  3. 3 where commission_pct is null
  4. 4 and rownum = 1;
  5. COALESCE(COMMISSION_PCT,0)
  6. --------------------------
  7. 0

使用CASE:

  1. HR@XE> select
  2. 2 case
  3. 3 when commission_pct is null then 0
  4. 4 else commission_pct
  5. 5 end commission_pct
  6. 6 from employees
  7. 7 where commission_pct is null
  8. 8 and rownum = 1;
  9. COMMISSION_PCT
  10. --------------
  11. 0

使用DECODE:

  1. HR@XE> select
  2. 2 decode(commission_pct,null, 0,
  3. 3 commission_pct) commission_pct
  4. 4 from employees
  5. 5 where commission_pct is null
  6. 6 and rownum = 1;
  7. COMMISSION_PCT
  8. --------------
  9. 0

我通常都是使用NVL函数来检查空值的,但是,看上去COALESCE函数更加普遍(可以检查多个参数)并且COALESCE是一个所有关系型数据库系统都支持的标准函数。

那么是不是我该改变一下自己使用NVL的习惯转而使用COALESCE呢?各位有什么建议?

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11990/viewspace-830534/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/11990/viewspace-830534/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值