数据库Oracle通用函数

通用函数:可用于任意数据类型,并且适用于空值。
• NVL (expr1, expr2)
• NVL2 (expr1, expr2, expr3)
• NULLIF (expr1, expr2)
• COALESCE (expr1, expr2, ..., exprn)

 

NVL(expr1, expr2) 函数:转换一个空值到一个实际的值。
expr1,expr2:可用的数据类型可以是日期、字符和数字。两个参数的数据类型必须匹配。
expr1:是包含空值的源值或者表达式
expr2:是用于转换空值的目的值

例:计算所有员工的年佣金,如果没有佣金则返回年薪

SQL> select last_name,salary,12*salary*nvl(commission_pct,1) from employees order by salary;
LAST_NAME                     SALARY 12*SALARY*NVL(COMMISSION_PCT,1
------------------------- ---------- ------------------------------
Olson                        2100.00                          25200
Markle                       2200.00                          26400
Philtanker                   2200.00                          26400
Landry                       2400.00                          28800
Gee                          2400.00                          28800
Colmenares                   2500.00                          30000
Marlow                       2500.00                          30000
Patel                        2500.00                          30000
Vargas                       2500.00                          30000
Sullivan                     2500.00                          30000
Perkins                      2500.00                          30000
Himuro                       2600.00                          31200
Matos                        2600.00                          31200
OConnell                     2600.00                          31200
Grant                        2600.00                          31200
Mikkilineni                  2700.00                          32400
Seo                          2700.00                          32400
Tobias                       2800.00                          33600
Atkinson                     2800.00                          33600
Geoni                        2800.00                          33600

 

 

NVL2(expr1, expr2, expr3) 函数:

NVL2 函数检查第一个表达式,如果第一个表达式不为空,那么 NVL2 函数返回第二个表达式;

如果第一个表达式为空,那么第三个表达式被返回。

expr1:是可能包含空的源值或表达式。
expr2:expr1 非空时的返回值。
expr3:expr1 为空时的返回值

例:计算所有员工的年薪,如果有佣金包含佣金。

SQL> select last_name,salary,commission_pct,to_char((12*salary*nvl2(commission_pct,commission_pct,0)+12*salary),'l999,999,999') from employees order by commission_pct;
LAST_NAME                     SALARY COMMISSION_PCT TO_CHAR((12*SALARY*NVL2(COMMIS
------------------------- ---------- -------------- ------------------------------
Lee                          6800.00           0.10               ¥89,760
Johnson                      6200.00           0.10               ¥81,840
Marvins                      7200.00           0.10               ¥95,040
Banda                        6200.00           0.10               ¥81,840
Kumar                        6100.00           0.10               ¥80,520
Ande                         6400.00           0.10               ¥84,480
Greene                       9500.00           0.15              ¥131,100
Grant                        7000.00           0.15               ¥96,600
Tuvault                      7000.00           0.15               ¥96,600
Bates                        7300.00           0.15              ¥100,740
Smith                        7400.00           0.15              ¥102,120
Taylor                       8600.00           0.20              ¥123,840
Bloom                       10000.00           0.20              ¥144,000
Fox                          9600.00           0.20              ¥138,240
Cambrault                    7500.00           0.20              ¥108,000

 

NULLIF(expr1, expr2)函数:

比较两个表达式,如果相等,函数返回空,如果不相等,函数返回第一个表达式。第一个表达式不能为 NULL。
expr1 是对于 expr2 的被比较原值
expr2 是对于 expr1 的被比较原值。(如果它不等于 expr1,expr1 被返回)。

例:查询雇员,显示他们的 first_name 与长度,长度列命名为 expr1。last_name 与长度,长度命名为 expr2。判断他们的 first_name 与 last_name 的长度,如果长度相同返回空,否则返回 first_name 的长度。判断结果列命名为 result。

SQL> select first_name,length(first_name) "expr1",
  2  last_name,length(last_name) "expr2",
  3  nullif(length(first_name),length(last_name)) "result"
  4  from employees;
FIRST_NAME                expr1 LAST_NAME                      expr2     result
-------------------- ---------- ------------------------- ---------- ----------
Ellen                         5 Abel                               4          5
Sundar                        6 Ande                               4          6
Mozhe                         5 Atkinson                           8          5
David                         5 Austin                             6          5
Hermann                       7 Baer                               4          7
Shelli                        6 Baida                              5          6
Amit                          4 Banda                              5          4
Elizabeth                     9 Bates                              5          9
Sarah                         5 Bell                               4          5
David                         5 Bernstein                          9          5
Laura                         5 Bissot                             6          5
Harrison                      8 Bloom                              5          8
Alexis                        6 Bull                               4          6
Anthony                       7 Cabrio                             6          7
Gerald                        6 Cambrault                          9          6
Nanette                       7 Cambrault                          9          7
John                          4 Chen                               4 
Kelly                         5 Chung                              5 
Karen                         5 Colmenares                        10          5
Curtis                        6 Davies                             6 
FIRST_NAME                expr1 LAST_NAME                      expr2     result

 

COALESCE (expr1, expr2, ... exprn) 函数:返回列表中的第一个非空表达式。
expr1 如果它非空,返回该表达式
expr2 如果第一个表达式为空并且该表达式非空,返回该表达式
exprn 如果前面的表达式都为空,返回该表达式

例:查询雇员表,如果 COMMISSION_PCT 值是非空,显示它。如果 COMMISSION_PCT值是空,则显示 SALARY 。如果 COMMISSION_PCT 和 SALARY 值都是空,那么显示10。

SQL> select last_name,coalesce(COMMISSION_PCT,salary,10) from employees;
LAST_NAME                 COALESCE(COMMISSION_PCT,SALARY
------------------------- ------------------------------
King                                               24000
Kochhar                                            17000
De Haan                                            17000
Hunold                                              9000
Ernst                                               6000
Austin                                              4800
Pataballa                                           4800
Lorentz                                             4200
Greenberg                                          12008
Russell                                              0.4
Partners                                             0.3
Errazuriz                                            0.3
Cambrault                                            0.3
Zlotkey                                              0.2
Tucker                                               0.3
Bernstein                                           0.25
Hall                                                0.25
Olsen                                                0.2
Cambrault                                            0.2
Tuvault                                             0.15
King                                                0.35
Sully                                               0.35

 

条件表达式:

– CASE 表达式
– DECODE 函数

CASE  表达式:

 

CASE 表达式:CASE 表达式可以让你在 SQL 语句中使用 IF-THEN-ELSE 逻辑。如果没有 WHEN ... THEN 满足条件,并且 ELSE 子句存在,Oracle 返回 else_expr。否则,Oracle 返回 null。所有的表达式 ( expr、comparison_expr 和 return_expr) 必须是相同的数据类型。

 

示例:
查询雇员,显示 last_name,job_id,salary 如果 JOB_ID 是 IT_PROG,薪水增加 10%;如果 JOB_ID 是 ST_CLERK,薪水增加 15%;如果 JOB_ID 是 SA_REP,薪水增加 20%。对于所有其他的工作角色,不增加薪水。

 

SQL> select last_name,job_id,salary,
  2  CASE job_id 
  3  WHEN 'IT_PORG' THEN salary*1.1
  4  WHEN 'ST_CLERK' THEN salary*1.5
  5  WHEN 'SA_REP' THEN salary*1.2
  6  END
  7  from employees;
LAST_NAME                 JOB_ID         SALARY CASEJOB_IDWHEN'IT_PORG'THENSAL
------------------------- ---------- ---------- ------------------------------
King                      AD_PRES      24000.00 
Kochhar                   AD_VP        17000.00 
De Haan                   AD_VP        17000.00 
Hunold                    IT_PROG       9000.00 
Ernst                     IT_PROG       6000.00 
Austin                    IT_PROG       4800.00 
Pataballa                 IT_PROG       4800.00 
Lorentz                   IT_PROG       4200.00 
Greenberg                 FI_MGR       12008.00 
Faviet                    FI_ACCOUNT    9000.00 
Chen                      FI_ACCOUNT    8200.00 
Sciarra                   FI_ACCOUNT    7700.00 
Urman                     FI_ACCOUNT    7800.00 
Popp                      FI_ACCOUNT    6900.00 
Raphaely                  PU_MAN       11000.00 
Khoo                      PU_CLERK      3100.00 
Baida                     PU_CLERK      2900.00 
Tobias                    PU_CLERK      2800.00 
Himuro                    PU_CLERK      2600.00 
Colmenares                PU_CLERK      2500.00 

 

DECODE 函数:

 

DECODE 函数:DECODE 函数以一种类似于在多种语言中使用的 IF-THEN-ELSE 逻辑的方法判断一个表达式。 DECODE 函数在比较表达式 (expression) 和每个查找 (search)值后,如果表达式与查找相同,返回结果。如果省略默认值,当没有查找值与表达式相匹配时返回一个空值。

 

示例:
使用 DECODE 函数完成(显示 last_name,job_id,salary 如果 JOB_ID 是 IT_PROG,薪水增加 10%;如果 JOB_ID 是 ST_CLERK,薪水增加 15%;如果 JOB_ID 是 SA_REP,薪水增加 20%。对于所有其他的工作角色,不增加薪水。)

SQL> select last_name,job_id,salary,
  2  decode(job_id,'IT_PORG',salary*1.1,'ST_CLERK',salary*1.15,'SA_REP',salary*1.2)
  3  from employees 
  4  order by SALARY;
LAST_NAME                 JOB_ID         SALARY DECODE(JOB_ID,'IT_PORG',SALAR
------------------------- ---------- ---------- -----------------------------
Olson                     ST_CLERK      2100.00                          2415
Markle                    ST_CLERK      2200.00                          2530
Philtanker                ST_CLERK      2200.00                          2530
Landry                    ST_CLERK      2400.00                          2760
Gee                       ST_CLERK      2400.00                          2760
Colmenares                PU_CLERK      2500.00 
Marlow                    ST_CLERK      2500.00                          2875
Patel                     ST_CLERK      2500.00                          2875
Vargas                    ST_CLERK      2500.00                          2875
Sullivan                  SH_CLERK      2500.00 
Perkins                   SH_CLERK      2500.00 
Himuro                    PU_CLERK      2600.00 
Matos                     ST_CLERK      2600.00                          2990
OConnell                  SH_CLERK      2600.00 
Grant                     SH_CLERK      2600.00 
Mikkilineni               ST_CLERK      2700.00                          3105
Seo                       ST_CLERK      2700.00                          3105
Tobias                    PU_CLERK      2800.00 
Atkinson                  ST_CLERK      2800.00                          3220

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值