DECODE函數


    DECODE函數相當於一條件語句(IF),它將輸入數值與函數中的參數列表相比較,根據輸入值返回一個對應值。函數的參數列表是由若干數值及其對應結果值組成的若干
序偶形式。當然,如果未能與任何一個實參序偶匹配成功,則函數也有默認的返回值。區別於SQL的其它函數,DECODE函數還能識別和操作空值。
    其具體的語法格式如下:
      DECODE(input_value,value,result[,value,result...][,default_result]);
    其中:
     input_value試圖處理的數值。DECODE函數將該數值與一系列的序偶相比較,以決定最后的返回結果value是一組成序偶的數值。如果輸入數值與之匹配成功,則相應的結果將被返回。
     對應一個空的返回值,可以使用關鍵字NULL於之對應;
     result是一組成序偶的結果值;
     default_result未能與任何一序偶匹配成功時,函數的返回的默認值。
下面以例子說明:

利用DECODE函數求出基於不同職位的(job)每個員工加薪后的工資值。涉及的表名:emp
SQL> select ename "Name",job,sal "Salary",
  2         DECODE(job,'SALESMAN',sal*1.15,
  3                'CLERK', sal*1.20,
  4                'ANALYST',sal*1.25,
  5                         sal*1.40) "New Salary"
  6   from emp
  7  order by job;

Name             JOB                Salary New Salary
-------   ---------        ---------- ----------
SCOTT             ANALYST              3000     3750
FORD             ANALYST              3000     3750
MILLER           CLERK                1300     1560
JAMES             CLERK                950       1140
SMITH             CLERK                800       960
ADAMS             CLERK                1100     1320
BLAKE             MANAGER              2850     3990
JONES             MANAGER              2975     4165
CLARK             MANAGER              2450     3430
KING             PRESIDENT            5000     7000
TURNER           SALESMAN              1500     1725
MARTIN           SALESMAN              1250   1437.5
WARD             SALESMAN              1250   1437.5
ALLEN             SALESMAN              1600     1840

已選擇14行。

在上面例子查詢語句中,DECODE函數執行的步驟如下:
(1)、當job為SALESMAN時DECODE函數返回表達式sal*1.5的值,否則,執行(2);
(2)、當job為CLERK時DECODE函數返回表達式sal*1.20的值,否則,執行(3);
(3)、當job為ANALYST時DECODE函數返回表達式sal*1.25的值,否則,執行(4);
(4)、DECODE函數返回表達式sal*1.40的值。

最近10天中每天日志切換的量(即可分析10天的波度,又可分析24小時內,可很容易看出異常情況)
SELECT SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH:MI:SS'),1,5) Day,
       SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'00',1,0)) H00,
       SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'01',1,0)) H01, 
       SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'02',1,0)) H02,
       SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'03',1,0)) H03,
       SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'04',1,0)) H04,
       SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'05',1,0)) H05,
       SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'06',1,0)) H06,
       SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'07',1,0)) H07,
       SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'08',1,0)) H08,
       SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'09',1,0)) H09,
       SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'10',1,0)) H10,
       SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'11',1,0)) H11, 
       SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'12',1,0)) H12,
       SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'13',1,0)) H13, 
       SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'14',1,0)) H14,
       SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'15',1,0)) H15, 
       SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'16',1,0)) H16, 
       SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'17',1,0)) H17, 
       SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'18',1,0)) H18, 
       SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'19',1,0)) H19, 
       SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'20',1,0)) H20, 
       SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'21',1,0)) H21,
       SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'22',1,0)) H22 , 
       SUM(DECODE(SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH24:MI:SS'),10,2),'23',1,0)) H23, 
       COUNT(*) TOTAL 
FROM v$log_history  a  
   where first_time>=to_char(sysdate-11)
GROUP BY SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH:MI:SS'),1,5) 
ORDER BY SUBSTR(TO_CHAR(first_time, 'MM/DD/RR HH:MI:SS'),1,5) DESC;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM