概述:leizhimin 51cto技术博客SQL语句中的CASE语句与高级语言中的switch语句,是标准SQL的语法,适用与一个条件判断有多种值的情况下分别执行不同的操作。灵活应用CASE语句可以使SQL语句变得简洁易读,下面在DB2环境下通过一个简单的查询来展示SQL CASE语句的强大功能。
leizhimin 51cto技术博客 leizhimin 51cto技术博客环境:leizhimin 51cto技术博客Windows XP Professional
leizhimin 51cto技术博客DB2 V9.1
leizhimin 51cto技术博客 leizhimin 51cto技术博客问题:leizhimin 51cto技术博客有一个行业代码表,建表SQL和数据如下,要求查出代码别名、代码名、行业名、代码长度。代码别名为数字序号与大写英文字母的序号的映射值,比如代码 '01'的别名就是'A','02'的别名就是'B',依次类推。
leizhimin 51cto技术博客 leizhimin 51cto技术博客建表SQL和初始化数据SQL
leizhimin 51cto技术博客-------------------------------------
leizhimin 51cto技术博客drop table DM_HYML;
leizhimin 51cto技术博客create table DM_HYML
leizhimin 51cto技术博客(
leizhimin 51cto技术博客 HYML_DM CHAR(2) not null,
leizhimin 51cto技术博客 HYML_MC VARCHAR(100) not null,
leizhimin 51cto技术博客 XYBZ CHAR(1) not null
leizhimin 51cto技术博客);
leizhimin 51cto技术博客alter table DM_HYML
leizhimin 51cto技术博客 add primary key (HYML_DM);
leizhimin 51cto技术博客comment on table DM_HYML is
leizhimin 51cto技术博客 '行业门类代码表';
leizhimin 51cto技术博客comment on column DM_HYML.HYML_DM is
leizhimin 51cto技术博客 '行业门类代码';
leizhimin 51cto技术博客comment on column DM_HYML.HYML_MC is
leizhimin 51cto技术博客 '行业门类名称';
leizhimin 51cto技术博客comment on column DM_HYML.XYBZ is
leizhimin 51cto技术博客 '选用标志';
leizhimin 51cto技术博客 leizhimin 51cto技术博客delete from DM_HYML;
leizhimin 51cto技术博客insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
leizhimin 51cto技术博客values ('01', '农、林、牧、渔业', 'Y');
leizhimin 51cto技术博客insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
leizhimin 51cto技术博客values ('03', '制造业', 'Y');
leizhimin 51cto技术博客insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
leizhimin 51cto技术博客values ('02', '采矿业', 'Y');
leizhimin 51cto技术博客insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
leizhimin 51cto技术博客values ('04', '电力、燃气及水的生产和供应业', 'Y');
leizhimin 51cto技术博客insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
leizhimin 51cto技术博客values ('05', '建筑业', 'Y');
leizhimin 51cto技术博客insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
leizhimin 51cto技术博客values ('06', '交通运输、仓储和邮政业', 'Y');
leizhimin 51cto技术博客insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
leizhimin 51cto技术博客values ('07', '信息传输、计算机服务和软件业', 'Y');
leizhimin 51cto技术博客insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
leizhimin 51cto技术博客values ('08', '批发和零售业', 'Y');
leizhimin 51cto技术博客insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
leizhimin 51cto技术博客values ('09', '住宿和餐饮业', 'Y');
leizhimin 51cto技术博客insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
leizhimin 51cto技术博客values ('10', '金融业', 'Y');
leizhimin 51cto技术博客insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
leizhimin 51cto技术博客values ('11', '房地产业', 'Y');
leizhimin 51cto技术博客insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
leizhimin 51cto技术博客values ('12', '租赁和商务服务业', 'Y');
leizhimin 51cto技术博客insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
leizhimin 51cto技术博客values ('13', '科学研究、技术服务和地质勘查业', 'Y');
leizhimin 51cto技术博客insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
leizhimin 51cto技术博客values ('14', '水利、环境和公共设施管理业', 'Y');
leizhimin 51cto技术博客insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
leizhimin 51cto技术博客values ('15', '居民服务和其他服务业', 'Y');
leizhimin 51cto技术博客insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
leizhimin 51cto技术博客values ('16', '教育', 'Y');
leizhimin 51cto技术博客insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
leizhimin 51cto技术博客values ('17', '卫生、社会保障和社会福利业', 'Y');
leizhimin 51cto技术博客insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
leizhimin 51cto技术博客values ('18', '文化、体育和娱乐业', 'Y');
leizhimin 51cto技术博客insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
leizhimin 51cto技术博客values ('19', '公共管理和社会组织', 'Y');
leizhimin 51cto技术博客insert into DM_HYML (HYML_DM, HYML_MC, XYBZ)
leizhimin 51cto技术博客values ('20', '国际组织', 'Y');
leizhimin 51cto技术博客commit;
leizhimin 51cto技术博客 leizhimin 51cto技术博客实现:leizhimin 51cto技术博客 leizhimin 51cto技术博客select (case t.hyml_dmleizhimin 51cto技术博客 when '01' then 'A'leizhimin 51cto技术博客 when '02' then 'B'leizhimin 51cto技术博客 when '03' then 'C'leizhimin 51cto技术博客 when '04' then 'D'leizhimin 51cto技术博客 when '05' then 'E'leizhimin 51cto技术博客 when '06' then 'F'leizhimin 51cto技术博客 when '07' then 'G'leizhimin 51cto技术博客 when '08' then 'H'leizhimin 51cto技术博客 when '09' then 'I'leizhimin 51cto技术博客 when '10' then 'J'leizhimin 51cto技术博客 when '11' then 'K'leizhimin 51cto技术博客 when '12' then 'L'leizhimin 51cto技术博客 when '13' then 'M'leizhimin 51cto技术博客 when '14' then 'N'leizhimin 51cto技术博客 when '15' then 'O'leizhimin 51cto技术博客 when '16' then 'P'leizhimin 51cto技术博客 when '17' then 'Q'leizhimin 51cto技术博客 when '18' then 'R'leizhimin 51cto技术博客 when '19' then 'S'leizhimin 51cto技术博客 when '20' then 'T'leizhimin 51cto技术博客 when '21' then 'U'leizhimin 51cto技术博客 when '22' then 'V'leizhimin 51cto技术博客 when '23' then 'W'leizhimin 51cto技术博客 when '24' then 'X'leizhimin 51cto技术博客 when '25' then 'Y'leizhimin 51cto技术博客 when '26' then 'Z'leizhimin 51cto技术博客 end) as hydmbm,leizhimin 51cto技术博客 t.hyml_dm,leizhimin 51cto技术博客 t.hyml_mc,leizhimin 51cto技术博客 length(t.hyml_dm) as sublenth,leizhimin 51cto技术博客 '00' as zbleizhimin 51cto技术博客 from dm_hyml tleizhimin 51cto技术博客 leizhimin 51cto技术博客 将此sql代码保存为C:\test.sql文件,在DOS下进入DB2安装目录的bin目录下,链接数据库并执行(命令)此SQL,并重定向输出查询结果和信息到C:\test.txt。
leizhimin 51cto技术博客 leizhimin 51cto技术博客C:\IBM\SQLLIB\BIN>db2 -tvf C:\test.sql > C:\test.txt
leizhimin 51cto技术博客 leizhimin 51cto技术博客执行结果:leizhimin 51cto技术博客打开C:\test.txt文件查看结果:
leizhimin 51cto技术博客 leizhimin 51cto技术博客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
leizhimin 51cto技术博客 leizhimin 51cto技术博客HYDMBM HYML_DM HYML_MC SUBLENTH ZB
leizhimin 51cto技术博客------ ------- ---------------------------------- ----- --
leizhimin 51cto技术博客A 01 农、林、牧、渔业 2 00
leizhimin 51cto技术博客C 03 制造业 2 00
leizhimin 51cto技术博客B 02 采矿业 2 00
leizhimin 51cto技术博客D 04 电力、燃气及水的生产和供应业 2 00
leizhimin 51cto技术博客E 05 建筑业 2 00
leizhimin 51cto技术博客F 06 交通运输、仓储和邮政业 2 00
leizhimin 51cto技术博客G 07 信息传输、计算机服务和软件业 2 00
leizhimin 51cto技术博客H 08 批发和零售业 2 00
leizhimin 51cto技术博客I 09 住宿和餐饮业 2 00
leizhimin 51cto技术博客J 10 金融业 2 00
leizhimin 51cto技术博客K 11 房地产业 2 00
leizhimin 51cto技术博客L 12 租赁和商务服务业 2 00
leizhimin 51cto技术博客M 13 科学研究、技术服务和地质勘查业 2 00
leizhimin 51cto技术博客N 14 水利、环境和公共设施管理业 2 00
leizhimin 51cto技术博客O 15 居民服务和其他服务业 2 00
leizhimin 51cto技术博客P 16 教育 2 00
leizhimin 51cto技术博客Q 17 卫生、社会保障和社会福利业 2 00
leizhimin 51cto技术博客R 18 文化、体育和娱乐业 2 00
leizhimin 51cto技术博客S 19 公共管理和社会组织 2 00
leizhimin 51cto技术博客T 20 国际组织 2 00
leizhimin 51cto技术博客 leizhimin 51cto技术博客 20 条记录已选择。
leizhimin 51cto技术博客 leizhimin 51cto技术博客呵呵,CASE语句方便吧。
leizhimin 51cto技术博客 leizhimin 51cto技术博客注意:DB2命令行下执行sql语句只能是一行,如果要执行多行,可以将sql保存为文件执行,执行的方法是:
leizhimin 51cto技术博客 leizhimin 51cto技术博客1、执行SQL语句
leizhimin 51cto技术博客db2 -tvf [filename].sql
leizhimin 51cto技术博客2、执行存储过程
leizhimin 51cto技术博客db2 -td@ -vf [filename].sql
leizhimin 51cto技术博客 leizhimin 51cto技术博客当然这些命令的选项根据需要有所不同,可以直接从命令行查看这些选项:db2 ? OPTIONS
leizhimin 51cto技术博客 选项 描述 缺省设置
leizhimin 51cto技术博客 ------ ---------------------------------------- ---------------
leizhimin 51cto技术博客 -a 显示 SQLCA OFF
leizhimin 51cto技术博客 -c 自动落实 ON
leizhimin 51cto技术博客 -d 检索并显示 XML 声明 OFF
leizhimin 51cto技术博客 -e 显示 SQLCODE/SQLSTATE OFF
leizhimin 51cto技术博客 -f 读取输入文件 OFF
leizhimin 51cto技术博客 -i 显示 XML 数据并带有缩进 OFF
leizhimin 51cto技术博客 -l 将命令记录到历史记录文件中 OFF
leizhimin 51cto技术博客 -n 除去换行字符 OFF
leizhimin 51cto技术博客 -o 显示输出 ON
leizhimin 51cto技术博客 -p 显示 db2 交互式提示符 ON
leizhimin 51cto技术博客 -q 保留空格和换行符 OFF
leizhimin 51cto技术博客 -r 将输出报告保存到文件 OFF
leizhimin 51cto技术博客 -s 在命令出错时停止执行 OFF
leizhimin 51cto技术博客 -t 设置语句终止字符 OFF
leizhimin 51cto技术博客 -v 回传当前命令 OFF
leizhimin 51cto技术博客 -w 显示 FETCH/SELECT 警告消息 ON
leizhimin 51cto技术博客 -x 不打印列标题 OFF
leizhimin 51cto技术博客 -z 将所有输出保存到输出文件 OFF
leizhimin 51cto技术博客 leizhimin 51cto技术博客注意:leizhimin 51cto技术博客 使用 DB2OPTIONS 环境变量定制选项缺省值。
leizhimin 51cto技术博客 紧跟选项字母后的减号(-)使该选项关闭。
leizhimin 51cto技术博客 若将减号(-)更改为加号(+),则选项
leizhimin 51cto技术博客 文件输入方式)。
leizhimin 51cto技术博客 leizhimin 51cto技术博客 leizhimin 51cto技术博客CASE和IF的区别:leizhimin 51cto技术博客在高级语言中,CASE的可以用IF来替代,但是在SQL中不行。
leizhimin 51cto技术博客CASE是SQL标准定义的,IF是数据库系统的扩展。
leizhimin 51cto技术博客CASE可以用于SQL语句和SQL存储过程、触发器,IF只能用于存储过程和触发器。
leizhimin 51cto技术博客在SQL过程和触发器中,用IF替代CASE代价都相当的高,相当的麻烦,难以实现。
leizhimin 51cto技术博客 leizhimin 51cto技术博客CASE语句应用对比:leizhimin 51cto技术博客下面做两组查询,每组用两种方法来实现,一种是用case,一种是不用case,谁快谁获胜,测试环境依然DB2 V9.1、windows server 2003。
leizhimin 51cto技术博客 leizhimin 51cto技术博客第一组:查询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
leizhimin 51cto技术博客 leizhimin 51cto技术博客B:不用CASE语句select count(*)
from dj_zt a
where a.qylx_dm = '03'
and a.zt in ('07', '11')
----------------
11829
leizhimin 51cto技术博客 leizhimin 51cto技术博客结果:A、B两组耗费的代价一样的,相比B的写法简洁,平局。leizhimin 51cto技术博客第二组:分别查询dj_zt表状态为'07'和'11'且qylx_dm = '03'的所有记录数。leizhimin 51cto技术博客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
leizhimin 51cto技术博客 leizhimin 51cto技术博客B:不用CASE语句(写了两条语句,扫描表两遍,效率明显低下)select count(*)
from dj_zt a
where a.qylx_dm = '03'
and a.zt='07'
----------------
4565
leizhimin 51cto技术博客 leizhimin 51cto技术博客select count(*)
from dj_zt a
where a.qylx_dm = '03'
and a.zt='11'
----------------
7264
leizhimin 51cto技术博客 leizhimin 51cto技术博客结果:B组代价明显高出A组很多,并且麻烦,A胜!leizhimin 51cto技术博客 leizhimin 51cto技术博客总结:通过上面两组实例可以看出,灵活应用CASE语句可以让SQL变得简洁高效,而且,CASE的使用一般不会引起性能(相比没有用CASE的语句)低下。