当前位置:数据库 > Oracle >>

Oracle DB NVL、NVL2、NULLIF、COALESCE函数

Oracle DB NVL、NVL2、NULLIF、COALESCE函数
 
下列函数可用于任何数据类型,且适合使用空值的场合:
• NVL (expr1, expr2) 
• NVL2 (expr1, expr2, expr3) 
• NULLIF (expr1, expr2) 
• COALESCE (expr1, expr2, ..., exprn) 
 
下列函数可用于任何数据类型,且适合表达式列表中使用空值的场合。
 
 
 
NVL函数
将空值转换为实际值:
• 可以使用的数据类型为日期、字符和数字。
• 数据类型必须匹配:
– NVL(commission_pct,0)
– NVL(hire_date,'01-JAN-97')
– NVL(job_id,'NoJob Yet')
 
要将空值转换为实际值,请使用NVL函数。
语法
NVL (expr1, expr2) 
在该语法中:
• expr1是可能包含空值的源值或表达式
• expr2是用于转换空值的目标值
可以使用NVL函数转换任意数据类型,但是返回值始终与expr1具有相同的数据类型。
各种数据类型的NVL转换
 
 
 
 
使用NVL函数
hr@TEST0924> SELECT last_name, salary, NVL(commission_pct, 0), (salary*12) + (salary*12*NVL(commission_pct, 0)) AN_SAL FROM employees; 

LAST_NAME                     SALARY NVL(COMMISSION_PCT,0)     AN_SAL
------------------------- ---------- --------------------- ----------
OConnell                        2600                     0      31200
Khoo                            3100                     0      37200
Vargas                          2500                     0      30000
Russell                        14000                    .4     235200
Bernstein                       9500                   .25     142500

 

要计算所有雇员的年度报酬,需要将月薪乘以12,然后再加上佣金百分比:
hr@TEST0924> SELECT last_name, salary, commission_pct, (salary*12) + (salary*12*commission_pct) AN_SAL FROM employees; 

LAST_NAME                     SALARY COMMISSION_PCT     AN_SAL
------------------------- ---------- -------------- ----------
OConnell                        2600
Vargas                          2500
Russell                        14000             .4     235200
Taylor                          3200

 

请注意,仅为那些领取佣金的雇员计算了年度报酬。如果表达式中的任何列值为空,则结果也为空。要计算所有雇员的年度报酬,必须将空值转换为数字,然后才能应用算术运算符。在示例中,NVL函数用于将空值转换为零。
 
使用NVL2函数
hr@TEST0924> SELECT last_name, salary, commission_pct, NVL2(commission_pct, 'SAL+COMM', 'SAL') income FROM employees WHERE department_id IN (50, 80); 

LAST_NAME                     SALARY COMMISSION_PCT INCOME
------------------------- ---------- -------------- --------
OConnell                        2600                        SAL
Russell                        14000             .4         SAL+COMM
Bernstein                       9500            .25         SAL+COMM

 

 
NVL2函数首先会检查第一个表达式。如果第一个表达式不为空,则NVL2函数会返回第二个表达式。如果第一个表达式为空,则返回第三个表达式。
语法
NVL2(expr1, expr2, expr3) 
在该语法中:
• expr1是可能包含空值的源值或表达式
• expr2是expr1不为空时返回的值
• expr3是expr1为空时返回的值
在示例中,检查的是COMMISSION_PCT列。如果检测到值,则返回文本文字值SAL+COMM。如果COMMISSION_PCT列包含空值,则返回文本文字值SAL。
注:参数expr1可以是任意数据类型。参数expr2和expr3可以是除LONG之外的任意数据类型。
 
使用NULLIF函数
hr@TEST0924> SELECT first_name, LENGTH(first_name) "expr1", last_name, LENGTH(last_name) "expr2",NULLIF(LENGTH(first_name), LENGTH(last_name)) result FROM employees;

FIRST_NAME                expr1 LAST_NAME                      expr2     RESULT
-------------------- ---------- ------------------------- ---------- ----------
Nanette                       7     Cambrault                          9          7
John                          4     Chen                                   4

 

NULLIF函数用于对两个表达式进行比较。
语法
NULLIF (expr1, expr2)
在该语法中:
• NULLIF用于对expr1和expr2进行比较。如果它们相等,则函数返回空值。如果不相等,则函数返回expr1。但不能为expr1指定文字值NULL。
在示例中,对EMPLOYEES表中名字的长度和EMPLOYEES表中姓氏的长度进行了比较。如果姓氏和名字的长度相等,则显示空值。如果姓氏和名字的长度不相等,
则显示名字的长度。
注:NULLIF函数在逻辑上等效于下面的CASE表达式。CASE表达式将在后续进行介绍:
CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END
 
使用COALESCE函数
• COALESCE函数优于NVL函数之处在于COALESCE函数可以接受多个备选值。
• 如果第一个表达式不为空,则COALESCE函数返回该表达式;否则,它将对其余的表达式执行COALESCE运算。
 
COALESCE函数用于返回列表中的第一个非空表达式。
语法
COALESCE (expr1, expr2, ... exprn)
在该语法中:
• expr1返回此表达式(如果它不为空)
• expr2返回此表达式(如果第一个表达式为空,而此表达式不为空)
• exprn返回此表达式(如果前面的表达式都为空)
请注意,所有表达式都必须具有相同的数据类型。
 
使用COALESCE函数
hr@TEST0924> SELECT last_name,employee_id, COALESCE(TO_CHAR(commission_pct),TO_CHAR(manager_id), 'No commission and no manager') FROM employees; 

LAST_NAME                 EMPLOYEE_ID COALESCE(TO_CHAR(COMMISSION_PCT),TO_CHAR
------------------------- ----------- ----------------------------------------
OConnell                          198 124
Gietz                             206 205
King                              100 No commission and no manager
Bernstein                         151 .25

 

 
在幻灯片中所示的示例中,如果manager_id值不为空,则会显示出来。如果manager_id值为空,则会显示commission_pct。如果manager_id和commission_pct值都为空,则会显示“No commission and no manager”。请注意,已应用TO_CHAR函数,所以所有表达式都具有相同的数据类型。
示例:
对于不领取佣金的雇员,你的组织想要将其薪金增加$2,000;对于领取佣金的雇员,在查询中应计算新的薪金,该薪金等于现有薪金加上佣金额。
 
hr@TEST0924> SELECT last_name, salary, commission_pct, COALESCE((salary+(commission_pct*salary)), salary+2000, salary) "New Salary" FROM employees; 

LAST_NAME                     SALARY COMMISSION_PCT New Salary
------------------------- ---------- -------------- ----------
OConnell                        2600                      4600
Bernstein                       9500            .25      11875
Hall                            9000            .25      11250

 

 
注:请检查输出。对于不领取佣金的雇员,New Salary 列显示增加了$2,000 后的薪金;对于领取佣金的雇员,New Salary 列显示计算的佣金额加上薪金。
Oracle
MySQL
Access
SQLServer
DB2
Excel
SQLite
SYBASE
Postgres
如果你遇到数据库难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,