標籤:end 基本 sql查詢語句 exp div 結構 比較 sel scott
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_salfrom emp order by deptno,new_sal;ENAME DEPTNO SAL NEW_SAL-------------------- ---------- ---------- ----------MILLER 10 1800 1980CLARK 10 2950 3245KING 10 5000 5500SMITH 20 1300 1560ADAMS 20 1600 1920FORD 20 3000 3600SCOTT 20 3000 3600JONES 20 3475 4170JAMES 30 1450 1885WARD 30 1750 2275MARTIN 30 1750 2275TURNER 30 2000 2600ALLEN 30 2100 2730BLAKE 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_salfrom emp;ENAME DEPTNO SAL NEW_SAL-------------------- ---------- ---------- ----------SCOTT 20 3000 3600SMITH 20 1300 1560ALLEN 30 2100 2730WARD 30 1750 2275JONES 20 3475 4170MARTIN 30 1750 2275BLAKE 30 3350 4355CLARK 10 2950 3245KING 10 5000 5500TURNER 30 2000 2600ADAMS 20 1600 1920JAMES 30 1450 1885FORD 20 3000 3600MILLER 10 1800 1980
在某些情況下,使用decode函數可以達到和case運算式一樣效果。
Oracle decode函數