您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關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 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.
第二種寫法:
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如何使用了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。