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的语)低下。

发表评论

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