Oracle 11g Release 1 (11.1) 单行函数——NULL 相关函数
2012-08-04 23:48
357 查看
本文内容
COALESCELNNVL
NULLIF
NVL
NVL2
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]NULL、AND、OR环境是无效的,否则必须考虑潜在的null。有时,Oracle数据库内部使用LNNVL函数,把NOTIN条件重写为NOTEXISTS条件。这种情况,执行计划的输出显示了计划表输出中的这个操作。条件可以计算任何标值,但不能包含AND、OR或BETWEEN的复合条件。
下表显示给定a=2,b为null,LNNVL返回值。
条件 | 条件为TRUE? | LNNVL返回值 |
a=1 | FALSE | TRUE |
a=2 | TRUE | FALSE |
aISNULL | FALSE | TRUE |
b=1 | UNKNOWN | TRUE |
bISNULL | TRUE | FALSE |
a=b | UNKNOWN | TRUE |
[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]
相关文章推荐
- Oracle 11g Release 1 (11.1) 单行函数——(返回数字值)字符函数
- Oracle 11g Release 1 (11.1) 单行函数——数字函数
- Oracle 11g Release 1 (11.1) 单行函数——比较函数
- Oracle 11g Release 1 (11.1) 单行函数——(返回字符值)字符函数
- Oracle 11g Release 1 (11.1) 单行函数——日期函数
- Oracle 11g Release 1 (11.1) 单行函数——NLS 字符函数
- Oracle 11g Release 1 (11.1) PL/SQL_了解静态和动态 SQL
- Oracle 11g Release 1 (11.1) 游标——显式游标
- Oracle 11g Release 1 (11.1) PL/SQL_了解 Collections 和 Records 类型
- Oracle 11g Release 1 (11.1) Oracle 本文索引的四种类型
- Oracle 11g Release 1 (11.1) 表空间——简单管理永久表空间
- Oracle 11g Release 1 (11.1)——自动存储管理(Automatic Storage Management,ASM)
- Oracle 11g Release (11.1) 索引底层的数据结构
- Oracle语法温故(字符串相关函数、数值相关函数、单行函数、多行函数)
- Oracle 11g Release 1 (11.1) 查询优化器的访问路径
- Oracle 11g Release 1 (11.1) 游标——在 PL/SQL 管理游标
- Oracle 11g Release 1 (11.1) SQL_层级查询(详)
- Oracle 11g Release 1 (11.1) Oracle 文本自定义 CONTEXT 索引的“偏好”
- Oracle 11g Release 1 (11.1) PL/SQL_了解静态和动态 SQL
- listagg 函数--oracle 11g release 2