NVL, NVL2 or COALESCE?

on

刚看完没什么感觉的春晚,闲来无事,再翻译一篇Eddie Awadblog

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:

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呢?各位有什么建议?

请使用这个链接进行函数使用率的投票。

全文完

译者:实际上吸引我的倒不是这篇文章,因为它太简单,呵呵。但是Eddie在文章的最后有一个投票的界面,还挺美观的,按照链接进去看了一下,dPolls,一个很实用的网上投票系统,并且提供了脚本用以将投票界面显示在自己的网页中,看来个人中心越来越受到服务提供商的重视了,无论是Flickr, Del.icio.us, 还是Planzo都提供了这样的脚本,网络中各种服务对于特定用户的体验都允许集中到这个用户自己的网页上,是个很好的现象,对吧。

注册dPolls很简单,注册完毕以后可以创建自己的投票,创建完毕以后dPolls会给出一段代码,将这段代码粘贴在自己的文章中就OK了,下面是我模仿Eddie作的一个完全相同的函数使用率投票,只是show一下界面,大家不要在我这里投,请使用上面的那个Eddie创建的投票链接。


Create polls and vote for free. dPolls.com

5 Comments Add yours

  1. yanggq says:

    I often used NVL, didn’t use the coalesce before I read the doc…….

  2. lunar says:

    kamus,你这些彩色代码是如何搞出来,可否教教我,给我email吧: lunar.zhang#gmail[dot]com

    另外,给我加个link吧 :)

  3. kamus says:

    link已经加了
    这些彩色代码是用coolcode插件显示出来的,是WP的插件,你用CSDN的blog,要想显示成这样恐怕很费劲了

  4. zhangdeshun says:

    Thank you! I understand!

  5. 希望有机会合作.
    郭先生
    同传租赁 同声传译翻译公司 同声传译设备租赁 同声传译 同声传译设备租赁 同传租赁 北京同传设备租赁 上海同声传译设备租赁 同声传译 同声翻译公司

Leave a Reply

Your email address will not be published. Required fields are marked *