欢迎光临
我们一直在努力

oracle中case和decode如何使用

这期内容当中小编将会给大家带来有关oracle中case和decode如何使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

总结:

DECODE
与CASE WHEN 的比较

      1.DECODE 只有Oracle
才有,其它数据库不支持;

      2.CASE WHEN的用法, Oracle、SQL Server、 MySQL 都支持;

      3.DECODE 只能用做相等判断,但是可以配合sign函数进行大于,小于,等于的判断,CASE
when可用于=,>=,<,<=,<>,is null,is not null 等的判断;

      4.DECODE 使用其来比较简洁,CASE 虽然复杂但更为灵活;

      5.另外,在decode中,null和null是相等的,但在case
when中,只能用is null来判断;decode函数还能用于行转列。

一、case表达式用法:
case when

case
when 类似我们的
if …then..else ,判断语句

语法如下:

CASE expr WHEN expr1
THEN return_expr1

         [WHEN expr2 THEN return_expr2

          …

          WHEN exprn THEN return_exprn

          ELSE else_expr]

END

第二种延伸用法:

CASE

         WHEN 
expr1 THEN return_expr1

         [WHEN expr2 THEN return_expr2

          ….

          WHEN exprn THEN return_exprn

          ELSE else_expr]

END

如果部门编号为
10的,显示为sal*1.1


如果部门编号为
20的,显示为sal*1.2


如果部门编号为
30的,显示为sal*1.3


否则显示为
sal


这一列查询的结果,列名显示为
isal
SQL> select
ename,deptno,sal,case deptno when 10 then
sal*1.1

  2  when
20 then sal*1.2

  3  when
30 then sal*1.3

  4  else
sal

  5  end
isal from tes
t_emp;

 ENAME          DEPTNO      SAL       ISAL
———-            ———-     ———- ———-

AAAABC

SMITH              20             800        960

ALLEN              30            1600       2080

WARD              30            1250       1625

JONES              20             2975       3570

MARTIN          30            1250       1625

BLAKE              30            2850       3705

CLARK              10           2450        2695

SCOTT              20           3002        3602.4

KING                10           5000        5500

TURNER          30          1500        1950

 ADAMS          20           1100       1320

JAMES             30             950       1235

FORD               20          3000       3600

MILLER           10          1300       1430

 15 rows selected.

第二种写法:
SQL> select
ename,deptno,sal,case when deptno=10 then
sal*1.1

  2  when deptno=20 then sal*1.2

  3  when
deptno=30 then sal*1.3

  4  else
sal

  5  end
isal from test_emp;

 ENAME          DEPTNO      SAL       ISAL
———-            ———-     ———- ———-

AAAABC

SMITH              20            800          960

ALLEN              30           1600       2080

WARD             30            1250       1625

JONES              20           2975       3570

MARTIN          30          1250       1625

BLAKE              30          2850       3705

CLARK              10          2450       2695

SCOTT              20         3002       3602.4

KING                10         5000       5500

TURNER          30         1500       1950

ADAMS            20         1100       1320

JAMES              30           950       1235

FORD               20         3000       3600

MILLER            10        1300       1430

 15 rows selected.

case不等值表达式的用法:

SQL> select
ename,deptno,sal,case when sal<2000 then sal+200

  2 when  sal between 2000 and 3000 then sal+100

  3  else
sal

  4  end
isal from test_emp;

 ENAME          DEPTNO      SAL       ISAL
———-            ———-     ———- ———-

AAAABC

SMITH             20        800       1000

ALLEN              30       1600       1800

WARD              30       1250       1450

JONES              20        2975       3075

MARTIN          30        1250       1450

BLAKE              30       2850       2950

CLARK              10       2450       2550

SCOTT              20       3002       3002

KING                10       5000       5000

TURNER          30       1500       1700

 ADAMS           20       1100       1300

JAMES              30        950       1150

FORD               20       3000       3100

MILLER           10       1300       1500

15 rows selected.

case用于判断空值,避免使用空值函数
SQL> select
ename,sal,comm,case when comm is null then sal else
sal+comm end isal from emp;

 ENAME          DEPTNO      SAL       ISAL
———-            ———-     ———- ———-

AAAABC

SMITH             800                           800

ALLEN            1600        300        1900

WARD            1250        500       1750

JONES             2975                      2975

MARTIN        1250       1400      2650

BLAKE            2850                     2850

CLARK            2450                     2450

SCOTT            3002                    3002

KING             5000                     5000

TURNER       1500          0        1500

ADAMS         1100                    1100

JAMES             950                   950

FORD             3000                  3000

MILLER         1300                  1300

15 rows selected.

二、decode函数用法
语法:

DECODE(col|expression,
search2, result1

                       [, search3,
result2,…,]

                        …

                       [, searchn,
resultn,…,]

                       [, default])

如果 条件=值1,那么显示结果1

如果 条件=值2,那么显示结果2

….

如果 条件=值n,那么显示结果n

都不符合,则显示缺省值
decode函数等值表达式的用法,与上面case表达式用法相比简便一些:
SQL> select ename,deptno,sal,decode(deptno,10,1.1*sal,20,1.2*sal,30,1.3*sal)isal from emp;
 ENAME          DEPTNO      SAL       ISAL
———-            ———-     ———- ———-
AAAABC
SMITH              20            800        960
ALLEN              30          1600       2080
WARD              30          1250       1625
JONES              20          2975       3570
MARTIN          30         1250       1625
BLAKE              30       2850       3705
CLARK              10       2450       2695
SCOTT              20       3002     3602.4
KING                10       5000       5500
TURNER          30       1500       1950
ADAMS            20       1100       1320
JAMES              30        950       1235
FORD               20       3000       3600
MILLER            10       1300       1430
15 rows selected.
注:decode不能用于非等值用法。

延伸用法:与sign函数联用比较大小

注:sign()函数根据参数1的值是0、正数还是负数,分别返回0、1、-1

select
ename,sal,decode(sign(sal-2000),1, '>2000 ',-1, '<2000 ', '=2000 ')
sal_level

from emp;

ENAME                       SAL SAL_LEVEL

——————–
———- ———–

SMITH                       800 <2000

ALLEN                      1600 <2000

WARD                       1250 <2000

JONES                      2975 >2000

MARTIN                     1250 <2000

BLAKE                      2850 >2000

CLARK                      2450 >2000

SCOTT                      3000 >2000

KING                       5000 >2000

TURNER                     1500 <2000

ADAMS                      1100 <2000

JAMES                       950 <2000

FORD                       3000 >2000

MILLER                     1300 <2000

decode函数用于行转列的转换

SQL> select
to_char(hiredate,'yyyy') from emp;

TO_C

—-
1980

1981

1981

1981

1981

1981

1981

1987

1981

1981

TO_C

—-

1987

1981

1981

1982

15 rows selected.

SQL> select
to_char(hiredate,'yyyy'),count(*) from emp group by to_char(hiredate,'yyyy');

 TO_C   COUNT(*)

—- ———-

                   1

1987         
2

1980         
1

1982         
1

1981        
10

SQL>
select
sum(decode(to_char(hiredate,'yyyy'),'1980',1))"1980",sum(decode(to_char(hiredate,'yyyy'),'1981',1))"1981",
sum(decode(to_char(hiredate,'yyyy'),'1987',1))"1987",sum(decode(to_char(hiredate,'yyyy'),'1982',1))"1982"
from emp;

      1980       1981    
  1987       1982

———-
———- ———- ———-

         1         10          2          1

上述就是小编为大家分享的oracle中case和decode如何使用了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注云搜网行业资讯频道。

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。