nvl、nvl2、nullif、coalesce函数用法区别

nvl、nv2、nullif、coalesce这四个函数,结合一块使用时,经常弄混,在此详细介绍下每个函数的用法并简单举例。

nvl相对来说,应用比较广,实际工作中会经常用到,其作用通俗来说就是去除空值。
写法为nvl(expr1,expr2),如果expr1为null则返回expr2,否则返回expr1

官方文档用法解释如下:

NVL

Syntax

De.ion of nvl.gif follows


Purpose

NVL lets you replace null (returned as a blank) with a string in the results of a query. If expr1 is null, then NVL returns expr2. If expr1 is not null, then NVLreturns expr1.

The arguments expr1 and expr2 can have any data type. If their data types are different, then Oracle Database implicitly converts one to the other. If they cannot be converted implicitly, then the database returns an error. The implicit conversion is implemented as follows:

  • If expr1 is character data, then Oracle Database converts expr2 to the data type of expr1 before comparing them and returns VARCHAR2 in the character set of expr1.

  • If expr1 is numeric, then Oracle Database determines which argument has the highest numeric precedence, implicitly converts the other argument to that data type, and returns that data type.


Examples

SQL> select * from scott.products;


LIST_PRICE MIN_PRICE

---------- ----------

     10000 8000

     20000

     30000 30000


SQL> select min_price,nvl(min_price,0) from scott.products;


 MIN_PRICE NVL(MIN_PRICE,0)

---------- ----------------

      8000 8000

                  0

     30000 30000

---------------------------------------------------------------------------------------------------------------------------------------

nvl2用法为nvl2(expr1,expr2,expr3),其作用是判断expr1是否为null,若不为null,返回expr2,为空返回expr3。

nvl(expr1,expr2)等同于nvl2(expr1,expr1,expr2)。

官方文档用法解释如下:

NVL2

Syntax

De.ion of nvl2.gif follows

Purpose

NVL2 lets you determine the value returned by a query based on whether a specified expression is null or not null. If expr1 is not null, then NVL2 returnsexpr2. If expr1 is null, then NVL2 returns expr3.

The argument expr1 can have any data type. The arguments expr2 and expr3 can have any data types except LONG.

If the data types of expr2 and expr3 are different, then Oracle Database implicitly converts one to the other. If they cannot be converted implicitly, then the database returns an error. If expr2 is character or numeric data, then the implicit conversion is implemented as follows:

  • If expr2 is character data, then Oracle Database converts expr3 to the data type of expr2 before returning a value unless expr3 is a null constant. In that case, a data type conversion is not necessary, and the database returns VARCHAR2 in the character set of expr2.


If expr2 is numeric data, then Oracle Database determines which argument has the highest numeric precedence, implicitly converts the other argument to that data type, and returns that data type.


Examples

SQL> select list_price,min_price,nvl2(min_price,min_price,list_price) nv2_m from scott.products;


LIST_PRICE MIN_PRICE NV2_M

---------- ---------- ----------

     10000 8000    8000

     20000             20000

     30000 30000  30000 


---------------------------------------------------------------------------------------------------------------------------------------

nullif用法为nullif(expr1,expr2),其作用是判断expr1与expr2是否相等,若相等则返回null,否则返回expr1。

官方文档用法解释如下:

NULLIF

Syntax

De.ion of nullif.gif follows

Purpose

NULLIF compares expr1 and expr2. If they are equal, then the function returns null. If they are not equal, then the function returns expr1. You cannot specify the literal NULL for expr1.

If both arguments are numeric data types, then Oracle Database determines the argument with the higher numeric precedence, implicitly converts the other argument to that data type, and returns that data type. If the arguments are not numeric, then they must be of the same data type, or Oracle returns an error.

The NULLIF function is logically equivalent to the following CASE expression:

CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END

Examples

SQL> select list_price,min_price,nullif(list_price,min_price) from scott.products;


LIST_PRICE MIN_PRICE NULLIF(LIST_PRICE,MIN_PRICE)

---------- ---------- ----------------------------

     10000 8000  10000

     20000           20000

     30000 30000


---------------------------------------------------------------------------------------------------------------------------------------

coalesce用法为coalesce(expr1,expr2……exprn),其作用是在expr1,expr2……exprn这列表达式中查找第一个不为null的值且返回该值。如果都为null,则返回null。

官方文档用法解释如下:

COALESCE

Syntax

De.ion of coalesce.gif follows

Purpose

COALESCE returns the first non-null expr in the expression list. You must specify at least two expressions. If all occurrences of expr evaluate to null, then the function returns null.

Oracle Database uses short-circuit evaluation. The database evaluates each expr value and determines whether it is NULL, rather than evaluating all of theexpr values before determining whether any of them is NULL.

If all occurrences of expr are numeric data type or any nonnumeric data type that can be implicitly converted to a numeric data type, then Oracle Database determines the argument with the highest numeric precedence, implicitly converts the remaining arguments to that data type, and returns that data type.


This function is a generalization of the NVL function.

You can also use COALESCE as a variety of the CASE expression. For example,

COALESCE(expr1, expr2)

is equivalent to:

CASE WHEN expr1 IS NOT NULL THEN expr1 ELSE expr2 END

Similarly,

COALESCE(expr1, expr2, ..., exprn)

where n >= 3, is equivalent to:

CASE WHEN expr1 IS NOT NULL THEN expr1 
   ELSE COALESCE (expr2, ..., exprn) END

Examples

SQL> select list_price,min_price,coalesce(list_price,min_price) from scott.products;


LIST_PRICE MIN_PRICE COALESCE(LIST_PRICE,MIN_PRICE)

---------- ---------- ------------------------------

     10000 8000   10000

     20000           20000

     30000 30000 30000


到此,nvl、nvl2、nullif、coalesce四个函数用法我们都了解了,看似很简单,但实际结合应用起来,就容易犯混,如下例子:

examples:

Examine the data in the LIST_PRICE and MIN_PRICE columns of the PRODUCTS table:

LIST_PRICE     MIN_PRICE

10000          8000

20000

30000          30000

Which two expressions give the same output? (Choose two.)

A. NVL(NULLIF(list_price, min_price), 0) 

B. NVL(COALESCE(list_price, min_price), 0)  

C. NVL2(COALESCE(list_price, min_price), min_price, 0)

D. COALESCE(NVL2(list_price, list_price, min_price), 0) 

Answer: BD
乍看你呢很快给出答案么,下面给出答案解析。
A. NVL(NULLIF(list_price, min_price), 0) 查询结果如下:
SQL> select NVL(NULLIF(list_price, min_price), 0) from scott.products;
NVL(NULLIF(LIST_PRICE,MIN_PRICE),0)
-----------------------------------
                              10000
                              20000
                                  0
B. NVL(COALESCE(list_price, min_price), 0) 查询结果如下:

SQL> select NVL(COALESCE(list_price, min_price), 0) from scott.products;


NVL(COALESCE(LIST_PRICE,MIN_PRICE),0)

-------------------------------------

                                10000

                                20000

                                30000

C. NVL2(COALESCE(list_price, min_price), min_price, 0)查询结果如下:

SQL> select NVL2(COALESCE(list_price, min_price), min_price, 0) from scott.products;

NVL2(COALESCE(LIST_PRICE,MIN_PRICE),MIN_PRICE,0)

------------------------------------------------

                                            8000

                                           30000

D. COALESCE(NVL2(list_price, list_price, min_price), 0) 查询结果如下:

SQL> select COALESCE(NVL2(list_price, list_price, min_price), 0) from scott.products;

COALESCE(NVL2(LIST_PRICE,LIST_PRICE,MIN_PRICE),0)

-------------------------------------------------

                                            10000

                                            20000

                                            30000

由此可见,选BD

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

转载于:http://blog.itpub.net/21251711/viewspace-1179435/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值