SQL中CASE语句强大成效详解

 **概述:

**

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语句能够让SQL变得不难高效,而且,CASE的应用相似不会挑起质量(相比较没有用CASE的言辞)低下。

发表评论

电子邮件地址不会被公开。 必填项已用*标注