decode函數在Oracle SQL查詢語句中的使用非常廣泛,也經常應用到PL/SQL語句塊中。 1,decode()函數語句的基本表達式是: decode(expr1,expr2,expr3,[expr4]) 這個表達式個人理解,可以稱之為decode的比較運算,可以對比 nvl()函數和 co ...
decode函數在Oracle SQL查詢語句中的使用非常廣泛,也經常應用到PL/SQL語句塊中。
1,decode()函數語句的基本表達式是:
decode(expr1,expr2,expr3,[expr4])
這個表達式個人理解,可以稱之為decode的比較運算,可以對比 nvl()函數和 coalesce()函數。可以作如下理解該表達式:
1,如果expr1 = expr2,decode函數返回expr3表達式的值;
2,如果expr1 != expr2,decode函數返回expr4表達式的值,如果expr4未指定,則返回null;
使用示例1:
select decode(1,-1,100,90),decode(-1,-1,100,90),decode(0,-1,100) from dual;
DECODE(1,-1,100,90) DECODE(-1,-1,100,90) DECODE(0,-1,100)
------------------- -------------------- -------------------
90 100
示例說明:第一個decode函數表達式中,1 != -1,所以返回90;第二個decode函數表達式中,-1 = -1,所以返回100,第三個decode函數表達式中,0 != -1,但是未指定第4個表達式的值,所以函數返回null值。
示例2,decode函數另類用法:比如我們要查詢出emp表中,有獎金的員工和沒有獎金員工的總數量
通常情況下,我們需要兩個查詢語句:
select count(*) from emp where comm is not null;
select count(*) from emp where comm is null;
但是使用decode函數,我們可以在一行查詢中搞定:
select sum(decode(nvl(comm,1),1,1,0)) count_no_comm,sum(decode(nvl(comm,1),1,0,1)) conut_comm from emp; COUNT_NO_COMM CONUT_COMM ------------- ---------- 10 4
代碼說明:藉助於nvl() 函數來判定獎金comm是否為空,如果為空返回值為1,然後拿nvl的返回值和1進行比較,如果相等,返回1(說明comm為空),不等返回0(說明comm不為空); 最後sum對decode的返回結果進行加和,求出結果。
2,decode分段函數,是上述decode比較運算的一種變式,形式和case 表達式很相似,可以作為參考比較
語法結構:
decode(expr1,expr2,return_expr2, --如果expr1=expr2,返回return_expr2;
expr3,return_expr2, --如果expr1=expr3,返回return_expr3;
exprn,return_exprn, --如果expr1=expr2,返回return_exprn;
exprx) [new_expr] --如果expr1不再上述expr2-exprn之間,返回return_exprx; new_expr為別名
使用示例:根據部門ID不同,對薪資進行相應的調整
1,我們先用case表達式實現:
select ename,deptno,sal,case deptno when 10 then sal * 1.1 when 20 then sal * 1.2 when 30 then sal * 1.3 else sal end new_sal from emp order by deptno,new_sal; ENAME DEPTNO SAL NEW_SAL -------------------- ---------- ---------- ---------- MILLER 10 1800 1980 CLARK 10 2950 3245 KING 10 5000 5500 SMITH 20 1300 1560 ADAMS 20 1600 1920 FORD 20 3000 3600 SCOTT 20 3000 3600 JONES 20 3475 4170 JAMES 30 1450 1885 WARD 30 1750 2275 MARTIN 30 1750 2275 TURNER 30 2000 2600 ALLEN 30 2100 2730 BLAKE 30 3350 4355
2,使用decode函數實現
select ename,deptno,sal,decode(deptno,10,sal * 1.1, 20,sal * 1.2, 30,sal * 1.3, sal) new_sal from emp; ENAME DEPTNO SAL NEW_SAL -------------------- ---------- ---------- ---------- SCOTT 20 3000 3600 SMITH 20 1300 1560 ALLEN 30 2100 2730 WARD 30 1750 2275 JONES 20 3475 4170 MARTIN 30 1750 2275 BLAKE 30 3350 4355 CLARK 10 2950 3245 KING 10 5000 5500 TURNER 30 2000 2600 ADAMS 20 1600 1920 JAMES 30 1450 1885 FORD 20 3000 3600 MILLER 10 1800 1980
在某些情況下,使用decode函數可以達到和case表達式一樣效果。