» 网友学堂 » Mysql教程 » 详细说明一下SQL中CASE语句强大功能
详细说明一下SQL中CASE语句强大功能
作者:ljjk5 发表时间:2007-11-25 20:45 阅读:473次 在百度搜索相关内容

概述:leizhimin 51cto技术博客
SQL语句中的CASE语句与高级语言中的switch语句,是标准SQL的语法,适用与一个条件判断有多种值的情况下分别执行不同的操作。灵活应用CASE语句可以使SQL语句变得简洁易读,下面在DB2环境下通过一个简单的查询来展示SQL CASE语句的强大功能。leizhimin 51cto技术博客
leizhimin 51cto技术博客
环境:leizhimin 51cto技术博客
Windows XP Professionalleizhimin 51cto技术博客
DB2 V9.1leizhimin 51cto技术博客
leizhimin 51cto技术博客
问题:leizhimin 51cto技术博客
有一个行业代码表,建表SQL和数据如下,要求查出代码别名、代码名、行业名、代码长度。代码别名为数字序号与大写英文字母的序号的映射值,比如代码 '01'的别名就是'A','02'的别名就是'B',依次类推。leizhimin 51cto技术博客
leizhimin 51cto技术博客
建表SQL和初始化数据SQLleizhimin 51cto技术博客
-------------------------------------leizhimin 51cto技术博客
drop table DM_HYML;leizhimin 51cto技术博客
create table DM_HYMLleizhimin 51cto技术博客
(leizhimin 51cto技术博客
HYML_DM CHAR(2) not null,leizhimin 51cto技术博客
HYML_MC VARCHAR(100) not null,leizhimin 51cto技术博客
XYBZ CHAR(1) not nullleizhimin 51cto技术博客
);leizhimin 51cto技术博客
alter table DM_HYMLleizhimin 51cto技术博客
add primary key (HYML_DM);leizhimin 51cto技术博客
comment on table DM_HYML isleizhimin 51cto技术博客
'行业门类代码表';leizhimin 51cto技术博客
comment on column DM_HYML.HYML_DM isleizhimin 51cto技术博客
'行业门类代码';leizhimin 51cto技术博客
comment on column DM_HYML.HYML_MC isleizhimin 51cto技术博客
'行业门类名称';leizhimin 51cto技术博客
comment on column DM_HYML.XYBZ isleizhimin 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.txtleizhimin 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 tleizhimin 51cto技术博客
leizhimin 51cto技术博客
HYDMBM HYML_DM HYML_MC SUBLENTH ZBleizhimin 51cto技术博客
------ ------- ---------------------------------- ----- --leizhimin 51cto技术博客
A 01 农、林、牧、渔业 2 00leizhimin 51cto技术博客
C 03 制造业 2 00leizhimin 51cto技术博客
B 02 采矿业 2 00leizhimin 51cto技术博客
D 04 电力、燃气及水的生产和供应业 2 00leizhimin 51cto技术博客
E 05 建筑业 2 00leizhimin 51cto技术博客
F 06 交通运输、仓储和邮政业 2 00leizhimin 51cto技术博客
G 07 信息传输、计算机服务和软件业 2 00leizhimin 51cto技术博客
H 08 批发和零售业 2 00leizhimin 51cto技术博客
I 09 住宿和餐饮业 2 00leizhimin 51cto技术博客
J 10 金融业 2 00leizhimin 51cto技术博客
K 11 房地产业 2 00leizhimin 51cto技术博客
L 12 租赁和商务服务业 2 00leizhimin 51cto技术博客
M 13 科学研究、技术服务和地质勘查业 2 00leizhimin 51cto技术博客
N 14 水利、环境和公共设施管理业 2 00leizhimin 51cto技术博客
O 15 居民服务和其他服务业 2 00leizhimin 51cto技术博客
P 16 教育 2 00leizhimin 51cto技术博客
Q 17 卫生、社会保障和社会福利业 2 00leizhimin 51cto技术博客
R 18 文化、体育和娱乐业 2 00leizhimin 51cto技术博客
S 19 公共管理和社会组织 2 00leizhimin 51cto技术博客
T 20 国际组织 2 00leizhimin 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].sqlleizhimin 51cto技术博客
2、执行存储过程leizhimin 51cto技术博客
db2 -td@ -vf [filename].sqlleizhimin 51cto技术博客
leizhimin 51cto技术博客
当然这些命令的选项根据需要有所不同,可以直接从命令行查看这些选项:db2 ? OPTIONSleizhimin 51cto技术博客
选项 描述 缺省设置leizhimin 51cto技术博客
------ ---------------------------------------- ---------------leizhimin 51cto技术博客
-a 显示 SQLCA OFFleizhimin 51cto技术博客
-c 自动落实 ONleizhimin 51cto技术博客
-d 检索并显示 XML 声明 OFFleizhimin 51cto技术博客
-e 显示 SQLCODE/SQLSTATE OFFleizhimin 51cto技术博客
-f 读取输入文件 OFFleizhimin 51cto技术博客
-i 显示 XML 数据并带有缩进 OFFleizhimin 51cto技术博客
-l 将命令记录到历史记录文件中 OFFleizhimin 51cto技术博客
-n 除去换行字符 OFFleizhimin 51cto技术博客
-o 显示输出 ONleizhimin 51cto技术博客
-p 显示 db2 交互式提示符 ONleizhimin 51cto技术博客
-q 保留空格和换行符 OFFleizhimin 51cto技术博客
-r 将输出报告保存到文件 OFFleizhimin 51cto技术博客
-s 在命令出错时停止执行 OFFleizhimin 51cto技术博客
-t 设置语句终止字符 OFFleizhimin 51cto技术博客
-v 回传当前命令 OFFleizhimin 51cto技术博客
-w 显示 FETCH/SELECT 警告消息 ONleizhimin 51cto技术博客
-x 不打印列标题 OFFleizhimin 51cto技术博客
-z 将所有输出保存到输出文件 OFFleizhimin 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'
----------------
11829leizhimin 51cto技术博客
leizhimin 51cto技术博客
B:不用CASE语句
select count(*)
from dj_zt a
where a.qylx_dm = '03'
and a.zt in ('07', '11')
----------------
11829leizhimin 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 7264leizhimin 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的语句)低下。