• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
            概述:
            SQL語(yǔ)句中的CASE語(yǔ)句與高級(jí)語(yǔ)言中的switch語(yǔ)句,是標(biāo)準(zhǔn)SQL的語(yǔ)法,適用與一個(gè)條件判斷有多種值的情況下分別執(zhí)行不同的操作。靈活應(yīng)用CASE語(yǔ)句可以使SQL語(yǔ)句變得簡(jiǎn)潔易讀,下面在DB2環(huán)境下通過(guò)一個(gè)簡(jiǎn)單的查詢來(lái)展示SQL CASE語(yǔ)句的強(qiáng)大功能。
            環(huán)境:
            Windows XP Professional
            DB2 V9.1
            問(wèn)題:
            有一個(gè)行業(yè)代碼表,建表SQL和數(shù)據(jù)如下,要求查出代碼別名、代碼名、行業(yè)名、代碼長(zhǎng)度。代碼別名為數(shù)字序號(hào)與大寫(xiě)英文字母的序號(hào)的映射值,比如代碼 '01'的別名就是'A','02'的別名就是'B',依次類推。
            建表SQL和初始化數(shù)據(jù)SQL
            -------------------------------------
            drop table DM_HYML;
            create table DM_HYML
            (
            HYML_DM CHAR(2) not null,
            HYML_MC VARCHAR(100) not null,
            XYBZ    CHAR(1) not null
            );
            alter table DM_HYML
            add primary key (HYML_DM);
            comment on table DM_HYML is
                '行業(yè)門類代碼表';
            comment on column DM_HYML.HYML_DM is
                '行業(yè)門類代碼';
            comment on column DM_HYML.HYML_MC is
                '行業(yè)門類名稱';
            comment on column DM_HYML.XYBZ is
                '選用標(biāo)志';
            delete from DM_HYML;
            insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
            values ('01', '農(nóng)、林、牧、漁業(yè)', 'Y');
            insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
            values ('03', '制造業(yè)', 'Y');
            insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
            values ('02', '采礦業(yè)', 'Y');
            insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
            values ('04', '電力、燃?xì)饧八纳a(chǎn)和供應(yīng)業(yè)', 'Y');
            insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
            values ('05', '建筑業(yè)', 'Y');
            insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
            values ('06', '交通運(yùn)輸、倉(cāng)儲(chǔ)和郵政業(yè)', 'Y');
            insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
            values ('07', '信息傳輸、計(jì)算機(jī)服務(wù)和軟件業(yè)', 'Y');
            insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
            values ('08', '批發(fā)和零售業(yè)', 'Y');
            insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
            values ('09', '住宿和餐飲業(yè)', 'Y');
            insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
            values ('10', '金融業(yè)', 'Y');
            insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
            values ('11', '房地產(chǎn)業(yè)', 'Y');
            insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
            values ('12', '租賃和商務(wù)服務(wù)業(yè)', 'Y');
            insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
            values ('13', '科學(xué)研究、技術(shù)服務(wù)和地質(zhì)勘查業(yè)', 'Y');
            insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
            values ('14', '水利、環(huán)境和公共設(shè)施管理業(yè)', 'Y');
            insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
            values ('15', '居民服務(wù)和其他服務(wù)業(yè)', 'Y');
            insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
            values ('16', '教育', 'Y');
            insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
            values ('17', '衛(wèi)生、社會(huì)保障和社會(huì)福利業(yè)', 'Y');
            insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
            values ('18', '文化、體育和娛樂(lè)業(yè)', 'Y');
            insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
            values ('19', '公共管理和社會(huì)組織', 'Y');
            insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
            values ('20', '國(guó)際組織', 'Y');
            commit;
            實(shí)現(xiàn):
            select (case t.hyml_dm
                     when '01' then 'A'
                     when '02' then 'B'
                     when '03' then 'C'
                     when '04' then 'D'
                     when '05' then 'E'
                     when '06' then 'F'
                     when '07' then 'G'
                     when '08' then 'H'
                     when '09' then 'I'
                     when '10' then 'J'
                     when '11' then 'K'
                     when '12' then 'L'
                     when '13' then 'M'
                     when '14' then 'N'
                     when '15' then 'O'
                     when '16' then 'P'
                     when '17' then 'Q'
                     when '18' then 'R'
                     when '19' then 'S'
                     when '20' then 'T'
                     when '21' then 'U'
                     when '22' then 'V'
                     when '23' then 'W'
                     when '24' then 'X'
                     when '25' then 'Y'
                     when '26' then 'Z'
                   end) as hydmbm,
                   t.hyml_dm,
                   t.hyml_mc,
                   length(t.hyml_dm) as sublenth,
                   '00' as zb
            from dm_hyml t
            將此sql代碼保存為C:\test.sql文件,在DOS下進(jìn)入DB2安裝目錄的bin目錄下,鏈接數(shù)據(jù)庫(kù)并執(zhí)行(命令)此SQL,并重定向輸出查詢結(jié)果和信息到C:\test.txt。
            C:\IBM\SQLLIB\BIN>db2 -tvf C:\test.sql > C:\test.txt
            執(zhí)行結(jié)果:
            打開(kāi)C:\test.txt文件查看結(jié)果:
            select (case t.hyml_dm when '01' then 'A' when '02' then 'B' when '03' then 'C' when '04' then 'D' when '05' then 'E' when '06' then 'F' when '07' then 'G' when '08' then 'H' when '09' then 'I' when '10' then 'J' when '11' then 'K' when '12' then 'L' when '13' then 'M' when '14' then 'N' when '15' then 'O' when '16' then 'P' when '17' then 'Q' when '18' then 'R' when '19' then 'S' when '20' then 'T' when '21' then 'U' when '22' then 'V' when '23' then 'W' when '24' then 'X' when '25' then 'Y' when '26' then 'Z' end) as hydmbm, t.hyml_dm, t.hyml_mc, length(t.hyml_dm) as sublenth, '00' as zb from dm_hyml t
            HYDMBM HYML_DM HYML_MC                                                                                                                                                                                                  SUBLENTH    ZB
            ------ ------- ---------------------------------- ----- --
            A      01      農(nóng)、林、牧、漁業(yè)                       2 00
            C      03      制造業(yè)                                 2 00
            B      02      采礦業(yè)                                 2 00
            D      04      電力、燃?xì)饧八纳a(chǎn)和供應(yīng)業(yè)           2 00
            E      05      建筑業(yè)                                 2 00
            F      06      交通運(yùn)輸、倉(cāng)儲(chǔ)和郵政業(yè)                 2 00
            G      07      信息傳輸、計(jì)算機(jī)服務(wù)和軟件業(yè)           2 00
            H      08      批發(fā)和零售業(yè)                           2 00
            I      09      住宿和餐飲業(yè)                           2 00
            J      10      金融業(yè)                                 2 00
            K      11      房地產(chǎn)業(yè)                               2 00
            L      12      租賃和商務(wù)服務(wù)業(yè)                       2 00
            M      13      科學(xué)研究、技術(shù)服務(wù)和地質(zhì)勘查業(yè)         2 00
            N      14      水利、環(huán)境和公共設(shè)施管理業(yè)             2 00
            O      15      居民服務(wù)和其他服務(wù)業(yè)                   2 00
            P      16      教育                                   2 00
            Q      17      衛(wèi)生、社會(huì)保障和社會(huì)福利業(yè)             2 00
            R      18      文化、體育和娛樂(lè)業(yè)                     2 00
            S      19      公共管理和社會(huì)組織                     2 00
            T      20      國(guó)際組織                               2 00
            20 條記錄已選擇。
            呵呵,CASE語(yǔ)句方便吧。
            注意:DB2命令行下執(zhí)行sql語(yǔ)句只能是一行,如果要執(zhí)行多行,可以將sql保存為文件執(zhí)行,執(zhí)行的方法是:
            1、執(zhí)行SQL語(yǔ)句
            db2 -tvf [filename].sql
            2、執(zhí)行存儲(chǔ)過(guò)程
            db2 -td@ -vf [filename].sql
            當(dāng)然這些命令的選項(xiàng)根據(jù)需要有所不同,可以直接從命令行查看這些選項(xiàng):db2 ? OPTIONS
            選項(xiàng)    描述                                      缺省設(shè)置
            ------ ---------------------------------------- ---------------
               -a    顯示 SQLCA                                OFF
               -c    自動(dòng)落實(shí)                                  ON
               -d    檢索并顯示 XML 聲明                       OFF
               -e    顯示 SQLCODE/SQLSTATE                     OFF
               -f    讀取輸入文件                              OFF
               -i    顯示 XML 數(shù)據(jù)并帶有縮進(jìn)                   OFF
               -l    將命令記錄到歷史記錄文件中                OFF
               -n    除去換行字符                              OFF
               -o    顯示輸出                                  ON
               -p    顯示 db2 交互式提示符                     ON
               -q    保留空格和換行符                          OFF
               -r    將輸出報(bào)告保存到文件                      OFF
               -s    在命令出錯(cuò)時(shí)停止執(zhí)行                      OFF
               -t    設(shè)置語(yǔ)句終止字符                          OFF
               -v    回傳當(dāng)前命令                              OFF
               -w    顯示 FETCH/SELECT 警告消息                ON
               -x    不打印列標(biāo)題                              OFF
               -z    將所有輸出保存到輸出文件                  OFF
            注意:
            使用 DB2OPTIONS 環(huán)境變量定制選項(xiàng)缺省值。
            緊跟選項(xiàng)字母后的減號(hào)(-)使該選項(xiàng)關(guān)閉。
            若將減號(hào)(-)更改為加號(hào)(+),則選項(xiàng)
            文件輸入方式)。
            CASE和IF的區(qū)別:
            在高級(jí)語(yǔ)言中,CASE的可以用IF來(lái)替代,但是在SQL中不行。
            CASE是SQL標(biāo)準(zhǔn)定義的,IF是數(shù)據(jù)庫(kù)系統(tǒng)的擴(kuò)展。
            CASE可以用于SQL語(yǔ)句和SQL存儲(chǔ)過(guò)程、觸發(fā)器,IF只能用于存儲(chǔ)過(guò)程和觸發(fā)器。
            在SQL過(guò)程和觸發(fā)器中,用IF替代CASE代價(jià)都相當(dāng)?shù)母撸喈?dāng)?shù)穆闊y以實(shí)現(xiàn)。
            CASE語(yǔ)句應(yīng)用對(duì)比:
            下面做兩組查詢,每組用兩種方法來(lái)實(shí)現(xiàn),一種是用case,一種是不用case,誰(shuí)快誰(shuí)獲勝,測(cè)試環(huán)境依然DB2 V9.1、windows server 2003。
            第一組:查詢dj_zt表狀態(tài)為'07'或'11'、qylx_dm = '03'的所有記錄數(shù)。
            A:用CASE語(yǔ)句
            select count(case a.zt when '07' then a.bs end)+
                count(case a.zt when '11' then a.bs end)
            from dj_zt a
            where a.qylx_dm = '03'
            ----------------
            11829
            B:不用CASE語(yǔ)句
            select count(*)
            from dj_zt a
            where a.qylx_dm = '03'
               and a.zt in ('07', '11')
            ----------------
            11829
            結(jié)果:A、B兩組耗費(fèi)的代價(jià)一樣的,相比B的寫(xiě)法簡(jiǎn)潔,平局。

            第二組:分別查詢dj_zt表狀態(tài)為'07'和'11'且qylx_dm = '03'的所有記錄數(shù)。
            A:用CASE語(yǔ)句
            select count(case a.zt when '07' then a.bs end),
                count(case a.zt when '11' then a.bs end)
            from dj_zt a
            where a.qylx_dm = '03
            ----------------
            4565 7264
            B:不用CASE語(yǔ)句(寫(xiě)了兩條語(yǔ)句,掃描表兩遍,效率明顯低下)
            select count(*)
            from dj_zt a
            where a.qylx_dm = '03'
               and a.zt='07'
            ----------------
            4565
            select count(*)
            from dj_zt a
            where a.qylx_dm = '03'
               and a.zt='11'
            ----------------
            7264
            結(jié)果:B組代價(jià)明顯高出A組很多,并且麻煩,A勝!
            CASE語(yǔ)句的兩種格式:
            一、上面是case單條件表達(dá)式的用法,屬于一種非常常用的特殊情況。語(yǔ)法格式為:
            case <單值表達(dá)式>
                   when <表達(dá)式值> then <SQL語(yǔ)句或者返回值>
                   when <表達(dá)式值> then <SQL語(yǔ)句或者返回值>
                   ...
                   when <表達(dá)式值> then <SQL語(yǔ)句或者返回值>
                   end
            有個(gè)很典型的用法(測(cè)試DB2 SQL腳本環(huán)境見(jiàn)附件):
            SELECT
            (CASE X.XZ
                    WHEN '01' THEN '內(nèi)資'
                    WHEN '02' THEN '外資'
                    WHEN '03' THEN '私營(yíng)'
                    WHEN '04' THEN '個(gè)體'
                    ELSE '變態(tài)性質(zhì)'
            END
            ) AS XZ_MC
            FROM ODS.dm_rpt_qyhf X
            GROUP BY XZ;
            注意:這語(yǔ)句用在查詢中,WHEN字句后面千萬(wàn)不要加逗號(hào)或者引號(hào)。否則就錯(cuò)了。
            另外,這種語(yǔ)法常用于控制存儲(chǔ)過(guò)程的SQL流程或者用于一個(gè)條件多種分支(值)的情況下執(zhí)行不同的操作或返回(也叫獲取)不同的值。當(dāng)用于存儲(chǔ)過(guò)程中的時(shí)候,實(shí)際上已經(jīng)不是基本SQL的CASE語(yǔ)句了,是存儲(chǔ)過(guò)程中CASE語(yǔ)句,用來(lái)控制流程:
            比如:用于存儲(chǔ)過(guò)程中的case語(yǔ)句
            case var1
                when '01' then values 'A' into var2;
                when '02' then values 'B' into var2;
                when '03' then values 'C' into var2;
                when '04' then values 'D' into var2;
                when '05' then values 'E' into var2;
                when '06' then values 'F' into var2;
                when '07' then values 'G' into var2;
                when '08' then values 'H' into var2;
                when '09' then values 'I' into var2;
                when '10' then values 'J' into var2;
                when '11' then values 'K' into var2;
                when '12' then values 'L' into var2;
                when '13' then values 'M' into var2;
                when '14' then values 'N' into var2;
                when '15' then values 'O' into var2;
                when '16' then values 'P' into var2;
                when '17' then values 'Q' into var2;
                when '18' then values 'R' into var2;
            end case;
            比如:用于單值條件表達(dá)式多分支查詢中
            select count(case a.zt when '07' then a.bs end),
                count(case a.zt when '11' then a.bs end)
            from dj_zt a
            where a.qylx_dm = '03
            二、下面是case語(yǔ)句更為通用的用法:
            case when <關(guān)系條件表達(dá)式> then <SQL語(yǔ)句或者返回值> end
            例如:
            select count(case when a.zt='07' then a.bs end),
                count(case when a.zt='11' then a.bs end)
            from dj_zt a
            where a.qylx_dm = '03
            上面的sql實(shí)際上可以改寫(xiě)為:
            select count(case a.zt when '07' then a.bs end),
                count(case a.zt when '11' then a.bs end)
            from dj_zt a
            where a.qylx_dm = '03
            兩者在效率上沒(méi)有差別的。
            總結(jié):通過(guò)上面兩組實(shí)例可以看出,靈活應(yīng)用CASE語(yǔ)句可以讓SQL變得簡(jiǎn)潔高效,可以明顯減少遍歷要查詢表的次數(shù),從而大大提高了執(zhí)行效率。而且,CASE的使用一般不會(huì)引起性能(相比沒(méi)有用CASE的語(yǔ)句)低下。

            Feedback

            # re: SQL語(yǔ)言的CASE語(yǔ)句  回復(fù)  更多評(píng)論   

            2011-02-24 19:02 by Mike
            <a href="http://www.google.com">google</a> the best!
            久久这里只有精品久久| 国产精品热久久无码av| avtt天堂网久久精品| 99久久国产综合精品成人影院| 久久国产免费| 中文字幕乱码人妻无码久久| 久久777国产线看观看精品| 久久久精品无码专区不卡| 久久精品国产亚洲av麻豆小说 | 91久久精品国产91性色也| 久久WWW免费人成一看片| 精品国产婷婷久久久| 久久精品国产网红主播| 久久久久久久波多野结衣高潮| 久久久91精品国产一区二区三区| 色综合久久88色综合天天 | 久久精品国产精品亚洲精品| 99久久精品免费看国产一区二区三区 | 久久久亚洲欧洲日产国码二区| 激情五月综合综合久久69| 久久午夜无码鲁丝片| 久久久久久久精品成人热色戒| 久久人搡人人玩人妻精品首页 | 亚洲国产综合久久天堂| 中文字幕亚洲综合久久2| 国产精品久久国产精品99盘| 伊人色综合久久天天人手人婷 | 久久精品人人做人人妻人人玩| 久久久精品国产| 久久综合色老色| 久久人人添人人爽添人人片牛牛| 国产呻吟久久久久久久92| 久久精品国产只有精品2020 | 精品一久久香蕉国产线看播放| 韩国免费A级毛片久久| 国产国产成人精品久久| 99久久精品费精品国产| 欧美成a人片免费看久久| 香蕉aa三级久久毛片| 国产精品久久新婚兰兰| 国产成人精品综合久久久|