隨筆-144  評論-80  文章-1  trackbacks-0
          http://www.psoug.org/reference/decode_case.html

          Oracle DECODE & CASE Functions

          Version 10.1

          Note: Decode and Case are very similar in their appearance but can produce very different results.
          Demo Tables & Data
           
          Decode Built-in Function
          Simple DECODE SELECT DECODE (value, <if this value>, <return this value>)
          FROM dual;
          SELECT program_id, 
            DECODE
          (customer_id, 'AAL', 'American Airlines') AIRLINE,
            delivered_date
          FROM airplanes
          WHERE ROWNUM < 11;
          More Complex DECODE SELECT DECODE (value,<if this value>,<return this value>,
                               <if this value>,<return this value>,
                               ....)
          FROM dual;
          SELECT program_id,
                 DECODE(customer_id, 
                        'AAL', 'American Airlines'
          ,
                        'ILC', 'Intl. Leasing Corp.',
                        'NWO', 'Northwest Orient',
                        'SAL', 'Southwest Airlines',
                        'SWA', 'Sweptwing Airlines',
                        'USAF', 'U.S. Air Force') AIRLINE,
                 delivered_date
          FROM airplanes
          WHERE ROWNUM < 11;
          DEOCODE with DEFAULT SELECT DECODE (value,<if this value>,<return this value>,
                               <if this value>,<return this value>,
                               ....
                               <otherwise this value>)
          FROM dual;
          SELECT program_id,
                 DECODE(customer_id,
                       'AAL', 'American Airlines',
                       'ILC', 'Intl. Leasing Corp.',
                       'NWO', 'Northwest Orient',
                       'SAL', 'Southwest Airlines',
                       'SWA', 'Sweptwing Airlines',
                       'USAF', 'United States Airforce',
                       'Not Known') AIRLINE,
                 delivered_date
          FROM airplanes
          WHERE ROWNUM < 11;
          Simple DECODE Crosstab

          Note how each decode only looks at a single possible value and turns it into a new column
          SELECT program_id,
                 DECODE(customer_id, 'AAL', 'AAL') AMERICAN,
                 DECODE(customer_id, 'DAL', 'DAL') DELTA,
                 DECODE(customer_id, 'NWO', 'NWO') NORTHWEST,
                 DECODE(customer_id, 'ILC', 'ILC') INTL_LEASING
          FROM airplanes
          WHERE rownum < 20;
          DECODE as an in-line view with crosstab summation The above DECODE, in blue, used as an in-line view
          SELECT program_id,
                 COUNT (AMERICAN) AAL,
                 COUNT (DELTA) DAL,
                 COUNT (NORTHWEST) NWO,
                 COUNT(INTL_LEASING) ILC
          FROM (
             SELECT program_id,
                    DECODE(customer_id, 'AAL', 'AAL') AMERICAN,
                    DECODE(customer_id, 'DAL', 'DAL') DELTA,
                    DECODE(customer_id, 'NWO', 'NWO') NORTHWEST,
                    DECODE(customer_id, 'ILC', 'ILC') INTL_LEASING
             FROM airplanes)
          GROUP BY program_id;
          Query for DECODE demo CREATE TABLE stores (
          store_name      VARCHAR2(20),
          region_dir      NUMBER(5),
          region_mgr      NUMBER(5),
          store_mgr1      NUMBER(5),
          store_mgr2      NUMBER(5),
          asst_storemgr1  NUMBER(5),
          asst_storemgr2  NUMBER(5),
          asst_storemgr3  NUMBER(5))
          TABLESPACE data_sml;

          INSERT INTO stores 
          VALUES ('San Francisco',100,200,301,302,401,0,403);

          INSERT INTO stores
          VALUES ('Oakland',100,200,301,0,404,0,0);

          INSERT INTO stores
          VALUES ('Palo Alto',100,200,0,305,0,405,406);

          INSERT INTO stores
          VALUES ('Santa Clara',100,250,0,306,0,0,407);
          COMMIT;

          SELECT DECODE(asst_storemgr1, 0,
                 
          DECODE(asst_storemgr2, 0,
                  
          DECODE(asst_storemgr3, 0, 0, asst_storemgr3),
                  asst_storemgr2), asst_storemgr1)
          ASST_MANAGER,
                  DECODE(store_mgr1,0, DECODE(store_mgr2,0, 0, store_mgr2)
          ,
                 store_mgr1)
          STORE_MANAGER,
                 REGION_MGR,
                 REGION_DIR
          FROM stores;
          DECODE with Summary Function SELECT SUM(CA_COUNT) CA, SUM(TX_COUNT) TX
          FROM (
             SELECT state,
             DECODE(state, 'CA', COUNT(*), 0) CA_COUNT,
             DECODE(state, 'TX', COUNT(*), 0) TX_COUNT
             FROM locations
             GROUP BY state);
          DECODE in the WHERE Clause

          set serveroutput on

          DECLARE

          posn  PLS_INTEGER := 0;
          empid PLS_INTEGER := 178;
          x     NUMBER;

          BEGIN
            SELECT NVL(SUM(ah.quantity * ah.saleprice * ap.payoutpct), 0)
            INTO x
            FROM accessoryhistory ah, payoutpercentage ap, 
            sku s, store st
            WHERE empid = DECODE(posn, 
              0, st.areadir,
              1, st.areamgr,
              2, NVL(st.storemgr1, st.storemgr2),
              3, NVL(st.asstmgr1, NVL(st.asstmgr2,
              st.asstmgr3)))
            AND ah.statustype IN ('ACT', 'DEA')
            AND ah.store = st.store
            AND s.dbid = ah.dbid
            AND s.sku = ah.sku
            AND ap.productgroup = s.productgroup
            AND ap.position = posn;

            dbms_output.put_line(x);
          END;
          /

           
          Case Built-in Function
          Simple CASE Demo SELECT CASE WHEN (<column_value> = <value>) THEN
                      WHEN (<column_value> = <value>) THEN
                      ELSE <value>
          FROM <table_name>;
          SELECT line_number,
             CASE WHEN (line_number = 1) THEN 'One'
                  WHEN (line_number = 2) THEN 'Two'
                  ELSE 'More Than Two'
             END
          AS RESULTSET
          FROM airplanes;
          More Complex CASE Demo With Between SELECT CASE WHEN (<column_value> BETWEEN <value> 
                       AND <value>) THEN
                      WHEN (<column_value>
                      BETWEEN <value> AND <value>) THEN
                      ELSE <value>
          FROM <table_name>;
          SELECT line_number,
             CASE WHEN (line_number BETWEEN 1 AND 10) THEN 'One'
                  WHEN (line_number BETWEEN 11 AND 100) THEN 'Big'
             ELSE 'Bigger'
             END
          FROM airplanes;
          More Complex CASE Demo With Booleans SELECT CASE WHEN (<column_value> <= <value>) THEN
                      WHEN (<
          column_value> <= <value>) THEN
                      ELSE <value>
          FROM <table_name>;
          SELECT line_number,
             CASE WHEN (line_number < 10) THEN 'Ones'
                  WHEN (line_number < 100) THEN 'Tens'
                  WHEN (line_number < 1000) THEN 'Hundreds'
             ELSE 'Thousands'
             END RESULT_SET
          FROM airplanes;
          The above demo turned into a view CREATE OR REPLACE VIEW line_number_view AS
          SELECT line_number,
             CASE WHEN (line_number < 10) THEN 'Ones'
                  WHEN (line_number < 100) THEN 'Tens'
                  WHEN (line_number < 1000) THEN 'Hundreds'
             ELSE 'Thousands'
             END RESULT_SET
          FROM airplanes;
           
          CASE - DECODE Comparison
          The same functionality written using both functions SELECT parameter, DECODE(SIGN(parameter-1000),-1,'C','P') AS BAND
          FROM parameter_table;

          SELECT parameter,
                 CASE WHEN parameter < 1000 THEN 'C' ELSE 'P' END AS BAND
          FROM parameter_table;
          posted on 2005-03-30 21:03 小力力力 閱讀(516) 評論(1)  編輯  收藏 所屬分類: ORACLE

          評論:
          # re: Oracle DECODE & CASE Functions 2005-04-20 16:30 | 小力力力
          select
          case when length(emp_id)=15 then '19'||substr(emp_id,7,2)||'-'||substr(emp_id,9,2)||'-'||substr(emp_id,11,2)
          else substr(emp_id,7,4)||'-'||substr(emp_id,11,2) ||'-'||substr(emp_id,13,2)
          end as emp_id
          from cus_emp_basic where emp_id is not null and length(emp_id)>14  回復  更多評論
            
          主站蜘蛛池模板: 阜平县| 泽普县| 老河口市| 罗源县| 胶南市| 扶余县| 泽普县| 崇左市| 嘉义县| 阿坝县| 海兴县| 固始县| 正安县| 怀仁县| 夏津县| 平度市| 滨州市| 新泰市| 鹰潭市| 平和县| 安丘市| 临海市| 达拉特旗| 颍上县| 明水县| 龙胜| 白玉县| 莲花县| 黔南| 纳雍县| 哈尔滨市| 囊谦县| 涟源市| 西乌珠穆沁旗| 防城港市| 鄂托克旗| 凤山县| 阿拉善右旗| 佛冈县| 武山县| 宿松县|