您的位置:首页 > 数据库 > Oracle

Oracle 11g Release 1 (11.1) 单行函数——NULL 相关函数

2012-08-04 23:48 357 查看
http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions001.htm#autoId14

 

本文内容

COALESCE
LNNVL
NULLIF
NVL
NVL2
 

NULL相关的函数方便处理null。

 

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

COALESCE返回在表达式列表中第一个非null的expr。必须指定至少两个表达式。若所有expr为null,则函数返回null。

Oracle数据库使用short-circuitevaluation。数据库计算每个expr的值,并确定是否为NULL,而不是计算所有expr后,再确定是否为NULL。

若所有expr出现数字类型,或可以隐式转换成数字类型的任何非数字类型,则Oracle数据库用最高数字优先(highestnumericprecedence)来确定参数,隐式把剩余参数转换成数字类型,并返回。

该函数是NVL函数的一般形式。

可以使用COALESCE实现CASE表达式。例如,

[code][code]COALESCE(expr1,expr2)

[/code]
[/code]

等价于:

[code]
[code]CASEWHENexpr1ISNOTNULLTHENexpr1ELSEexpr2END

[/code]
[/code]

以此类推,

[code]
[code]COALESCE(expr1,expr2,...,exprn),forn>=3

[/code]
[/code]

等价于:

[code]
[code]CASEWHENexpr1ISNOTNULLTHENexpr1


ELSECOALESCE(expr2,...,exprn)END

[/code]
[/code]

示例1:演示使用OracleOE.product_information表组织清仓甩卖。打折10%。若list_price列上没有,则实际价格为最低价格min_price。若没有最低价格,则实际价格为5。

[code]
[code]SQL>SELECTproduct_id,


2list_price,


3min_price,


4COALESCE(0.9*list_price,min_price,5)"Sale"


5FROMproduct_information


6WHEREsupplier_id=102050


7ORDERBYproduct_id,list_price,min_price,"Sale";


 


PRODUCT_IDLIST_PRICEMIN_PRICESale


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


17694843.2


17707373


2378305247274.5


2382850731765


33555


 


SQL>

[/code]
[/code]

 

LNNVL(condition)

当条件中一个或两个操作数为空时,LNNVL提供了一个简洁的方式评估条件。该函数只能用在WHERE查询子句。它需要一个条件作为参数,若条件为FALSE或UNKNOWN,则返回TRUE;若条件为TRUE,则返回FALSE。LNNVL可用在任何一个标量表达式,但在IS[NOT]NULLAND、OR环境是无效的,否则必须考虑潜在的null。

有时,Oracle数据库内部使用LNNVL函数,把NOTIN条件重写为NOTEXISTS条件。这种情况,执行计划的输出显示了计划表输出中的这个操作。条件可以计算任何标值,但不能包含AND、OR或BETWEEN的复合条件。

下表显示给定a=2,b为null,LNNVL返回值。

条件条件为TRUE?LNNVL返回值
a=1   FALSETRUE
a=2TRUE FALSE
aISNULLFALSE TRUE
b=1UNKNOWN TRUE
bISNULLTRUE FALSE
a=bUNKNOWN TRUE
示例2:演示假设你想知道提成率小于20%的员工数量,包括没有收到提成的员工。下面查询只返回收到小于20%提成的员工数量。

[code]
[code]SQL>SELECTCOUNT(*)FROMemployeesWHEREcommission_pct<.2;




COUNT(*)


----------


11




SQL>

[/code]
[/code]

若包含没有收到提成的72个员工,可以使用LNNVL函数:


[code]
[code]SQL>SELECTCOUNT(*)FROMemployeesWHERELNNVL(commission_pct>=.2);




COUNT(*)


----------


83




SQL>

[/code]
[/code]

 

NULLIF(expr1,expr2)

NULLIF比较expr1和expr2。若它们相等,则函数返回null。若不等,则返回expr1。不能为expr1指定NULL的字面义。

若这两个参数是数字类型,则Oracle数据库用最高数字优先来确定参数,隐式把其他参数转换成该类型,并返回该类型。若参数不是数字型,则它们必须是相同类型,否则,Oracle返回一个错误。

NULLIF函数逻辑上等价于如下CASE表达式:


[code]
[code]CASEWHENexpr1=expr2THENNULLELSEexpr1END

[/code]
[/code]

示例3:演示从OracleHR.employees表选择自从员工被雇佣以来,是否改变过工作。


[code]
[code]SQL>SELECTe.last_name,NULLIF(e.job_id,j.job_id)"OldJobID"


2FROMemployeese,job_historyj


3WHEREe.employee_id=j.employee_id


4ORDERBYlast_name,"OldJobID";




LAST_NAMEOldJobID


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


DeHaanAD_VP


HartsteinMK_MAN


KauflingST_MAN


KochharAD_VP


KochharAD_VP


RaphaelyPU_MAN


TaylorSA_REP


Taylor


WhalenAD_ASST


Whalen




10rowsselected




SQL>

[/code]
[/code]

 

NVL(expr1,expr2)

NVL可以用查询结果中的字符串替换null。若expr1为null,则NVL返回expr2。若expr1不为null,则返回expr1。

参数expr1和expr2可以是任何类型。若它们的类型不同,则Oracle数据库隐式把它们转换。若它们不能隐式转换,则Oracle返回一个错误。隐式转换按如下方式完成:Theimplicitconversionisimplementedasfollows:

若expr1是字符,则Oracle在比较它们前,把expr2转换成expr1的类型,并按expr1的字符集返回VARCHAR2。

若expr1是数字,则Oracle用最高数字优先来确定,隐式转换,并返回该类型。

示例4:演示员工姓名和提成,并用"NotApplicable"替换没有收到提成的员工。


[code]
[code]SQL>SELECTlast_name,


2NVL(TO_CHAR(commission_pct),'NotApplicable')"COMMISSION"


3FROMemployees


4WHERElast_nameLIKE'B%'


5ORDERBYlast_name;




LAST_NAMECOMMISSION


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


BaerNotApplicable


BaidaNotApplicable


Banda.1


Bates.15


BellNotApplicable


Bernstein.25


BissotNotApplicable


Bloom.2


BullNotApplicable




9rowsselected




SQL>

[/code]
[/code]

 

NVL2(expr1,expr2,expr3)

NVL2函数根据表达式是否为null确定值。若expr1为非null,则NVL2返回expr2。若expr1为null,则返回expr3。

参数expr1可以是任何类型。参数expr2和expr3可以是除LONG外的任何类型。

若expr2和expr3类型不同:

若expr2是字符数据,则Oracle数据库在比较前把expr3转换成expr2的类型,除非expr3是null常量。此时,不需要数据类型转换。Oracle返回expr2字符集的VARCHAR2 值。

若expr2是数字,则Oracle用最高数字优先(highestnumericprecedence)来确定,隐式转换,并返回该类型。

示例5:演示部分员工的收入,收入由工资加提成组成,这依赖于commission_pct列是否为null。


[code]
[code]SQL>SELECTlast_name,


2salary,


3NVL2(commission_pct,salary+(salary*commission_pct),salary)income


4FROMemployees


5WHERElast_namelike'B%'


6ORDERBYlast_name;




LAST_NAMESALARYINCOME


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


Baer10000.0010000


Baida2900.002900


Banda6200.006820


Bates7300.008395


Bell4000.004000


Bernstein9500.0011875


Bissot3300.003300


Bloom10000.0012000


Bull4100.004100




9rowsselected




SQL>

[/code]
[/code]



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
章节导航