实验16:分支的函数
case语句
语法:
CASE expr WHEN comparison_expr1THEN return_expr1
[WHEN comparison_expr2 THENreturn_expr2 WHEN comparison_exprn THENreturn_exprn ELSE else_expr]END
case分支语句计算工资
SQL> 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已选择12行。
decode函数
是oracle自定义的函数,其他数据库可能不支持。
语法:
DECODE(字段|表达式, 条件1,结果1
[,条件2,结果2…,] [,缺省值])
decode语句计算工资
SQL> SELECT ENAME,JOB,SAL,
DECODE(JOB,'CHERK' , 1.1*SAL ,'SALESMAN', 1.15*SAL, 'ANALYST', 1.2*SAL, SAL) "REVISED_SALARY" FROM EMP;ENAME JOB SAL REVISED_SALARY
---------- --------- ---------- -------------- SMITH CLERK 800 800 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 950 FORD ANALYST 3000 3600 MILLER CLERK 1300 1300已选择12行。
求税率,每2000一个台阶,8000以上按40%。
SQL> 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 SCOTT 3000 .09 KING 5000 .2 TURNER 1500 0 ADAMS 1100 0 JAMES 950 0 FORD 3000 .09 MILLER 1300 0已选择14行。
case语句和decode函数都是单行函数,每一行都有一个返回值。
从oracle的角度来讲,decode更好,各个版本都支持。
从横向来说,case更好,他是国标,不同的数据库都认可。
ps:得知不用出差,可以安心的继续学习了,很感谢现在的工作可以给我一些时间学习,忍着肚子疼将单行函数的博客整理完成,继续加油!
返回目录