SQL语句中的CASE语句与高级语言中的switch语句,是标准SQL的语法,适用与一个条件判断有多种值的情况下分别执行不同的操作。灵活应用CASE语句可以使SQL语句变得简洁易读,下面在DB2环境下通过一个简单的查询来展示SQL CASE语句的强大功能。
leizhimin 51cto技术博客
有一个行业代码表,建表SQL和数据如下,要求查出代码别名、代码名、行业名、代码长度。代码别名为数字序号与大写英文字母的序号的映射值,比如代码 '01'的别名就是'A','02'的别名就是'B',依次类推。
leizhimin 51cto技术博客
将此sql代码保存为C:\test.sql文件,在DOS下进入DB2安装目录的bin目录下,链接数据库并执行(命令)此SQL,并重定向输出查询结果和信息到C:\test.txt。
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技术博客
下面做两组查询,每组用两种方法来实现,一种是用case,一种是不用case,谁快谁获胜,测试环境依然DB2 V9.1、windows server 2003。
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技术博客
B:不用CASE语句select count(*)
from dj_zt a
where a.qylx_dm = '03'
and a.zt in ('07', '11')
----------------
11829
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技术博客
B:不用CASE语句(写了两条语句,扫描表两遍,效率明显低下)select count(*)
from dj_zt a
where a.qylx_dm = '03'
and a.zt='07'
----------------
4565
leizhimin 51cto技术博客
select count(*)
from dj_zt a
where a.qylx_dm = '03'
and a.zt='11'
----------------
7264
leizhimin 51cto技术博客
总结:通过上面两组实例可以看出,灵活应用CASE语句可以让SQL变得简洁高效,而且,CASE的使用一般不会引起性能(相比没有用CASE的语句)低下。