暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

分支函数(CASE语句及Decode函数)

Oracle微学堂 2019-03-28
1306

CASE语句

9I以后才支持的新特性,说叫语句其实是函数。目的是为了分支。

CASE expr WHEN comparison_expr1 THEN return_expr1

[WHEN comparison_expr2 THEN return_expr2

WHEN comparison_exprn THEN return_exprn

ELSE else_expr]

END


SELECT ename, job, sal,

CASE job WHEN 'CLERK' THEN 1.10*sal

WHEN 'SALESMAN' THEN 1.15*sal

WHEN 'ANALYST' THEN 1.20*sal

ELSE sal END "REVISED_SALARY"

FROM emp;

ENAME JOB SAL REVISED_SALARY

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

SMITH CLERK 800 880

ALLEN SALESMAN 1600 1840

WARD SALESMAN 1250 1437.5

JONES MANAGER 2975 2975

MARTIN SALESMAN 1250 1437.5

BLAKE MANAGER 2850 2850

CLARK MANAGER 2450 2450

KING PRESIDENT 5000 5000

TURNER SALESMAN 1500 1725

JAMES CLERK 950 1045

FORD ANALYST 3000 3600

MILLER CLERK 1300 1430

Decode函数

Decode函数,和CASE语句一样都是分支语句,但Decode函数是ORACLE自己定义的,其它数据

库可能不支持。

语法如下:

DECODE(col|expression, search1, result1

[, search2, result2,...,]

[, default])

例题:判别job,不同工作的人赋予不同的工资,除了CLERK,SALESMAN,ANALYST以外,其它的人工资不变,将函数的值起一个别名为REVISED_SALARY。


SELECT ename, job, sal,

decode(job ,'CLERK' , 1.10*sal

,'SALESMAN' , 1.15*sal

,'ANALYST' , 1.20*sal

, sal ) "REVISED_SALARY"

FROM emp;

ENAME JOB SAL REVISED_SALARY

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

SMITH CLERK 800 880

ALLEN SALESMAN 1600 1840

WARD SALESMAN 1250 1437.5

JONES MANAGER 2975 2975

MARTIN SALESMAN 1250 1437.5

BLAKE MANAGER 2850 2850

CLARK MANAGER 2450 2450

KING PRESIDENT 5000 5000

TURNER SALESMAN 1500 1725

JAMES CLERK 950 1045

FORD ANALYST 3000 3600

MILLER CLERK 1300 1430


下面的例题是求税率:不同工资上的税率不同。每2000一个台阶,8000以上一律40%的税。

SELECT ename, sal,

DECODE (TRUNC(sal/2000, 0),

0, 0.00,

1, 0.09,

2, 0.20,

3, 0.30

, 0.40

) TAX_RATE

FROM emp;

ENAME SAL TAX_RATE

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

SMITH 800 0

ALLEN 1600 0

WARD 1250 0

JONES 2975 .09

MARTIN 1250 0

BLAKE 2850 .09

CLARK 2450 .09

KING 5000 .2

TURNER 1500 0

JAMES 950 0

FORD 3000 .09

MILLER 1300 0

不管CASE语句还是DECODE函数,他们都是单行函数,每一行都有一个返回值。

从ORACLE角度来讲,DECODE更好,因为各个版本的数据库都支持,横向来说,CASE语句更好,因为它是国标,不同的数据库间都认可。

扫描二维码关注我的微学堂

搜索刘老师微信号:Rman-2014,备注“Oracle学习与咨询”,即可添加好友;或者扫描下面二维码,关注我的“微学堂”公众号,了解最新OCP认证动态、题库及答案解析、培训机构及讲师介绍、课堂授课内容等。每天还有一篇技术文章发布哦!


最后修改时间:2019-12-20 16:17:34
文章转载自Oracle微学堂,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论