青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Prayer

在一般中尋求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

SQL語言的CASE語句

Posted on 2009-05-07 11:28 Prayer 閱讀(1759) 評論(1)  編輯 收藏 引用 所屬分類: 數據庫,SQLDB2
概述:
SQL語句中的CASE語句與高級語言中的switch語句,是標準SQL的語法,適用與一個條件判斷有多種值的情況下分別執行不同的操作。靈活應用CASE語句可以使SQL語句變得簡潔易讀,下面在DB2環境下通過一個簡單的查詢來展示SQL CASE語句的強大功能。
環境:
Windows XP Professional
DB2 V9.1
問題:
有一個行業代碼表,建表SQL和數據如下,要求查出代碼別名、代碼名、行業名、代碼長度。代碼別名為數字序號與大寫英文字母的序號的映射值,比如代碼 '01'的別名就是'A','02'的別名就是'B',依次類推。
建表SQL和初始化數據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
    '行業門類代碼表';
comment on column DM_HYML.HYML_DM is
    '行業門類代碼';
comment on column DM_HYML.HYML_MC is
    '行業門類名稱';
comment on column DM_HYML.XYBZ is
    '選用標志';
delete from DM_HYML;
insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
values ('01', '農、林、牧、漁業', 'Y');
insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
values ('03', '制造業', 'Y');
insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
values ('02', '采礦業', 'Y');
insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
values ('04', '電力、燃氣及水的生產和供應業', 'Y');
insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
values ('05', '建筑業', 'Y');
insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
values ('06', '交通運輸、倉儲和郵政業', 'Y');
insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
values ('07', '信息傳輸、計算機服務和軟件業', 'Y');
insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
values ('08', '批發和零售業', 'Y');
insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
values ('09', '住宿和餐飲業', 'Y');
insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
values ('10', '金融業', 'Y');
insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
values ('11', '房地產業', 'Y');
insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
values ('12', '租賃和商務服務業', 'Y');
insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
values ('13', '科學研究、技術服務和地質勘查業', 'Y');
insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
values ('14', '水利、環境和公共設施管理業', 'Y');
insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
values ('15', '居民服務和其他服務業', 'Y');
insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
values ('16', '教育', 'Y');
insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
values ('17', '衛生、社會保障和社會福利業', 'Y');
insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
values ('18', '文化、體育和娛樂業', 'Y');
insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
values ('19', '公共管理和社會組織', 'Y');
insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
values ('20', '國際組織', 'Y');
commit;
實現:
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下進入DB2安裝目錄的bin目錄下,鏈接數據庫并執行(命令)此SQL,并重定向輸出查詢結果和信息到C:\test.txt。
C:\IBM\SQLLIB\BIN>db2 -tvf C:\test.sql > C:\test.txt
執行結果:
打開C:\test.txt文件查看結果:
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      農、林、牧、漁業                       2 00
C      03      制造業                                 2 00
B      02      采礦業                                 2 00
D      04      電力、燃氣及水的生產和供應業           2 00
E      05      建筑業                                 2 00
F      06      交通運輸、倉儲和郵政業                 2 00
G      07      信息傳輸、計算機服務和軟件業           2 00
H      08      批發和零售業                           2 00
I      09      住宿和餐飲業                           2 00
J      10      金融業                                 2 00
K      11      房地產業                               2 00
L      12      租賃和商務服務業                       2 00
M      13      科學研究、技術服務和地質勘查業         2 00
N      14      水利、環境和公共設施管理業             2 00
O      15      居民服務和其他服務業                   2 00
P      16      教育                                   2 00
Q      17      衛生、社會保障和社會福利業             2 00
R      18      文化、體育和娛樂業                     2 00
S      19      公共管理和社會組織                     2 00
T      20      國際組織                               2 00
20 條記錄已選擇。
呵呵,CASE語句方便吧。
注意:DB2命令行下執行sql語句只能是一行,如果要執行多行,可以將sql保存為文件執行,執行的方法是:
1、執行SQL語句
db2 -tvf [filename].sql
2、執行存儲過程
db2 -td@ -vf [filename].sql
當然這些命令的選項根據需要有所不同,可以直接從命令行查看這些選項:db2 ? OPTIONS
選項    描述                                      缺省設置
------ ---------------------------------------- ---------------
   -a    顯示 SQLCA                                OFF
   -c    自動落實                                  ON
   -d    檢索并顯示 XML 聲明                       OFF
   -e    顯示 SQLCODE/SQLSTATE                     OFF
   -f    讀取輸入文件                              OFF
   -i    顯示 XML 數據并帶有縮進                   OFF
   -l    將命令記錄到歷史記錄文件中                OFF
   -n    除去換行字符                              OFF
   -o    顯示輸出                                  ON
   -p    顯示 db2 交互式提示符                     ON
   -q    保留空格和換行符                          OFF
   -r    將輸出報告保存到文件                      OFF
   -s    在命令出錯時停止執行                      OFF
   -t    設置語句終止字符                          OFF
   -v    回傳當前命令                              OFF
   -w    顯示 FETCH/SELECT 警告消息                ON
   -x    不打印列標題                              OFF
   -z    將所有輸出保存到輸出文件                  OFF
注意:
使用 DB2OPTIONS 環境變量定制選項缺省值。
緊跟選項字母后的減號(-)使該選項關閉。
若將減號(-)更改為加號(+),則選項
文件輸入方式)。
CASE和IF的區別:
在高級語言中,CASE的可以用IF來替代,但是在SQL中不行。
CASE是SQL標準定義的,IF是數據庫系統的擴展。
CASE可以用于SQL語句和SQL存儲過程、觸發器,IF只能用于存儲過程和觸發器。
在SQL過程和觸發器中,用IF替代CASE代價都相當的高,相當的麻煩,難以實現。
CASE語句應用對比:
下面做兩組查詢,每組用兩種方法來實現,一種是用case,一種是不用case,誰快誰獲勝,測試環境依然DB2 V9.1、windows server 2003。
第一組:查詢dj_zt表狀態為'07'或'11'、qylx_dm = '03'的所有記錄數。
A:用CASE語句
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語句
select count(*)
from dj_zt a
where a.qylx_dm = '03'
   and a.zt in ('07', '11')
----------------
11829
結果:A、B兩組耗費的代價一樣的,相比B的寫法簡潔,平局。

第二組:分別查詢dj_zt表狀態為'07'和'11'且qylx_dm = '03'的所有記錄數。
A:用CASE語句
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語句(寫了兩條語句,掃描表兩遍,效率明顯低下)
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
結果:B組代價明顯高出A組很多,并且麻煩,A勝!
CASE語句的兩種格式:
一、上面是case單條件表達式的用法,屬于一種非常常用的特殊情況。語法格式為:
case <單值表達式>
       when <表達式值> then <SQL語句或者返回值>
       when <表達式值> then <SQL語句或者返回值>
       ...
       when <表達式值> then <SQL語句或者返回值>
       end
有個很典型的用法(測試DB2 SQL腳本環境見附件):
SELECT
(CASE X.XZ
        WHEN '01' THEN '內資'
        WHEN '02' THEN '外資'
        WHEN '03' THEN '私營'
        WHEN '04' THEN '個體'
        ELSE '變態性質'
END
) AS XZ_MC
FROM ODS.dm_rpt_qyhf X
GROUP BY XZ;
注意:這語句用在查詢中,WHEN字句后面千萬不要加逗號或者引號。否則就錯了。
另外,這種語法常用于控制存儲過程的SQL流程或者用于一個條件多種分支(值)的情況下執行不同的操作或返回(也叫獲取)不同的值。當用于存儲過程中的時候,實際上已經不是基本SQL的CASE語句了,是存儲過程中CASE語句,用來控制流程:
比如:用于存儲過程中的case語句
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;
比如:用于單值條件表達式多分支查詢中
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語句更為通用的用法:
case when <關系條件表達式> then <SQL語句或者返回值> 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實際上可以改寫為:
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語句可以讓SQL變得簡潔高效,可以明顯減少遍歷要查詢表的次數,從而大大提高了執行效率。而且,CASE的使用一般不會引起性能(相比沒有用CASE的語句)低下。

Feedback

# re: SQL語言的CASE語句  回復  更多評論   

2011-02-24 19:02 by Mike
<a href="http://www.google.com">google</a> the best!
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            性做久久久久久久免费看| 久久久久九九九| 亚洲欧美一区二区在线观看| 欧美成人福利视频| 午夜在线视频一区二区区别| 国产精品久久久久aaaa九色| 亚洲毛片在线观看.| 欧美激情精品久久久六区热门| 亚洲欧美日韩一区在线| 亚洲欧美另类久久久精品2019| 亚洲伦理在线观看| 亚洲国产视频直播| 欧美大片在线观看一区| 黑人极品videos精品欧美裸| 西瓜成人精品人成网站| 欧美一二三区在线观看| 夜夜爽www精品| 国内精品写真在线观看| 国产精品中文字幕欧美| 久久久国产成人精品| 久久夜色撩人精品| 一本色道久久综合狠狠躁篇怎么玩| av成人免费观看| 亚洲大片免费看| 亚洲天堂av高清| 亚洲国产欧美日韩精品| 99国产精品久久久久久久| 国产亚洲二区| 日韩亚洲欧美在线观看| 狠狠久久综合婷婷不卡| 亚洲一区在线播放| 夜夜嗨一区二区三区| 免费国产自线拍一欧美视频| 伊人天天综合| 性色av香蕉一区二区| 欧美国产亚洲另类动漫| 亚洲自拍偷拍网址| 欧美日韩一区二区视频在线观看| 久久精品一本久久99精品| 欧美日韩视频专区在线播放| 亚洲另类春色国产| 中国女人久久久| 国产精品国色综合久久| 性色av一区二区三区| 国产精品一级久久久| 午夜视频久久久久久| 欧美成人自拍| 亚洲伦理在线| 亚洲综合色婷婷| 欧美1级日本1级| 久久福利影视| 久久精品国产999大香线蕉| 欧美日韩国产在线播放网站| 欧美777四色影视在线| 国产亚洲一区二区精品| 亚洲欧美激情一区二区| 欧美激情免费观看| 每日更新成人在线视频| 在线国产亚洲欧美| 亚洲国产精品国自产拍av秋霞| 媚黑女一区二区| 毛片基地黄久久久久久天堂| 亚洲激情网站免费观看| 亚洲激情国产| 国产精品久久久久久av下载红粉| 亚洲网友自拍| 先锋影音久久久| 亚洲天堂成人在线观看| 午夜国产欧美理论在线播放| 国产综合在线看| 亚洲黄色在线观看| 国产精品色婷婷| 久久蜜桃香蕉精品一区二区三区| 久久综合九色综合久99| 国产亚洲成av人片在线观看桃 | 国产精品一区二区三区成人| 欧美一区二区三区久久精品茉莉花| 欧美一区二区成人| 伊人男人综合视频网| 亚洲美女视频在线观看| 国产欧美日韩在线播放| 91久久嫩草影院一区二区| 国模大胆一区二区三区| 亚洲黄色视屏| 久久午夜精品| 久久综合中文字幕| 国产精品毛片大码女人| 伊人久久久大香线蕉综合直播| 午夜精品福利电影| 欧美专区中文字幕| 国产区精品在线观看| 宅男精品视频| 亚洲欧美激情诱惑| 久久国产精品久久精品国产| 久久综合九色综合欧美狠狠| 国产精品无码专区在线观看| 一区二区三区日韩欧美| 夜夜嗨网站十八久久| 欧美日韩一区二区三区视频 | 免费人成精品欧美精品| 国内外成人在线视频| 性亚洲最疯狂xxxx高清| 欧美一区三区三区高中清蜜桃| 久久本道综合色狠狠五月| 亚洲国产精品尤物yw在线观看| 亚洲三级免费电影| 欧美视频一区二区三区…| 亚洲一区视频在线观看视频| 快播亚洲色图| 日韩午夜在线视频| 国产日韩欧美另类| 免费久久久一本精品久久区| 亚洲精品日韩欧美| 久久精品视频在线| 亚洲精品日韩在线观看| 国产欧美精品日韩| 欧美成人免费小视频| 亚洲欧美日韩久久精品| 亚洲每日更新| 欧美吻胸吃奶大尺度电影| 欧美一区二区在线| 艳女tv在线观看国产一区| 蜜臀99久久精品久久久久久软件| 亚洲一区二区在线免费观看视频 | 你懂的国产精品| 欧美一区二区黄| 亚洲色图制服丝袜| 亚洲国产欧美一区二区三区同亚洲 | 国产精品国产三级国产专播品爱网| 午夜亚洲伦理| 欧美一区二区三区四区在线观看地址 | 亚洲经典视频在线观看| 国产一区二区三区久久精品| 欧美日韩免费一区二区三区视频| 正在播放亚洲| 亚洲欧美在线播放| 亚洲精品一区二区三| 免费欧美电影| 欧美一区二区黄色| 香蕉乱码成人久久天堂爱免费| 亚洲深夜影院| 午夜激情亚洲| 久久久噜噜噜久噜久久| 欧美黄色网络| 国产欧美日韩亚洲精品| 久久精品主播| 久久久蜜桃一区二区人| 久久夜色精品一区| 亚洲国产毛片完整版| 日韩午夜电影在线观看| 亚洲麻豆一区| 欧美一区二区观看视频| 欧美激情一区二区三区不卡| 国内外成人免费激情在线视频网站| 国产日韩精品一区二区浪潮av| 欧美一区激情| 欧美二区视频| 国产亚洲人成a一在线v站| 一区二区av在线| 奶水喷射视频一区| 亚洲欧美日韩爽爽影院| 欧美精品综合| 亚洲第一精品夜夜躁人人躁| 午夜视频在线观看一区二区三区 | 亚洲黄色成人久久久| 亚洲欧美一区二区三区在线| 久久精品国产亚洲5555| 亚洲欧美激情视频在线观看一区二区三区| 久久久亚洲精品一区二区三区| 国产精品永久在线| 午夜精品久久久久久久99水蜜桃 | 日韩一级在线观看| 欧美国产日韩xxxxx| 一区二区激情视频| 久热精品视频在线| 国产精品久久精品日日| 亚洲欧洲在线看| 亚洲国内在线| 欧美bbbxxxxx| 午夜精品久久久久久久久久久久久| 蜜臀久久久99精品久久久久久| 国产日韩欧美在线播放不卡| 欧美在线www| 久久深夜福利免费观看| 国产乱码精品一区二区三区五月婷| 亚洲综合视频网| 中日韩男男gay无套| 国内激情久久| 欧美大片免费| 国产精品家教| 久久久久青草大香线综合精品| 久久免费黄色| 亚洲国产欧美在线人成| 亚洲国产婷婷香蕉久久久久久99| 中国成人在线视频| 欧美日韩中文在线| 欧美aa国产视频| 国产精品一级二级三级| 亚洲人妖在线| 亚洲精品久久7777|