大家对IF ELSE语句可能都很熟悉,它是用来对过程进行控制的。在SQL的世界中CASE语句语句有类似的效果。下面简单的介绍CASE语句的用法。考虑下面的情况,假设有个user表,定义如下:

CREATE TABLE USER   
 (   
 NAME VARCHAR(20) NOT NULL,---姓名   
 SEX INTEGER,---性别(1、男   2、女)   
 BIRTHDAY DATE---生日   
 );  
 CREATE TABLE USER
 (
 NAME VARCHAR(20) NOT NULL,---姓名
 SEX INTEGER,---性别(1、男 2、女)
 BIRTHDAY DATE---生日
 );

CASE使用场合1:把user表导出生成一个文件,要求性别为男或女,而不是1和2,怎么办?我们可以用如下的语句处理:

SELECT    
     NAME,   
     CASE SEX   
         WHEN 1 THEN '男'  
         ELSE '女'  
     END AS SEX,   
     BIRTHDAY   
 FROM USER;  
 SELECT 
  NAME,
  CASE SEX
   WHEN 1 THEN '男'
   ELSE '女'
  END AS SEX,
  BIRTHDAY
 FROM USER;


 

CASE使用场合2:假设user目前没有值,然后你往user导入了一批数据,但是很不幸,错把男设置成为2,而把女设置成为1,现在要求你变换过来,怎么办?

方法1:使用三条语句,先把2更新成3,接着把1更新成2,最后把3更新成1,很麻烦,不是吗?
UPDATE USER SET SEX=3 WHERE SEX=2;   
 UPDATE USER SET SEX=1 WHERE SEX=3;   
 UPDATE USER SET SEX=2 WHERE SEX=1;  
 UPDATE USER SET SEX=3 WHERE SEX=2;
 UPDATE USER SET SEX=1 WHERE SEX=3;
 UPDATE USER SET SEX=2 WHERE SEX=1;方法2:使用CASE语句
UPDATE USER SET SEX=   
 (   
 CASE SEX   
 WHEN 1 THEN 2   
 WHEN 2 THEN 1   
 ELSE SEX   
 END   
 );  
 UPDATE USER SET SEX=
 (
 CASE SEX
 WHEN 1 THEN 2
 WHEN 2 THEN 1
 ELSE SEX
 END
 );

      细心的朋友可能已经发现了,上面的方法1的三条语句的执行顺序有问题,没错,是我故意那些写的,仅仅是把1变成2,把2变成1就那么麻烦,而且很容易出错,想象一下,如果有很多这样的值需要变换,那是一种什么样的情况。还好,我们有CASE语句,有好多这样的值需要变换,CASE语句也不会存在问题。可能有些朋友还是有疑虑,这样做会不会死循环啊?哈哈,想法很好,如果你发现这样做会死循环,一定要告诉IBM,我反正没发现。

CASE使用场合3:假设让你把张三的生日更新成1949-10-1,李四的生日更新成1997-7-1等,类似这样的更新由很多。该怎么办呢?非常简单,大多数人会这么做。

update USER set BIRTHDAY='1949-10-1' where NAME='张三';   
 update USER set BIRTHDAY='1997-7-1' where NAME='李四';  
 update USER set BIRTHDAY='1949-10-1' where NAME='张三';
 update USER set BIRTHDAY='1997-7-1' where NAME='李四';

当USER表的数据量非常大,而NAME字段上又没有索引时,每条语句都要进行全表扫描,如果这样的语句有很多,效率会非常差,这时候我们可以用CASE语句,如下:

UPDATE USER SET BIRTHDAY=   
 (   
 CASE NAME   
 WHEN '张三' THEN '1949-10-1'  
 WHEN '李四' THEN '1997-7-1'  
 ELSE BIRTHDAY   
 END   
 )   
 where NAME in ('张三','李四');  
 UPDATE USER SET BIRTHDAY=
 (
 CASE NAME
 WHEN '张三' THEN '1949-10-1'
 WHEN '李四' THEN '1997-7-1'
 ELSE BIRTHDAY
 END
 )
 where NAME in ('张三','李四');以上语句只进行一次全表扫描,效率非常高。
---致谢:higny发现了本文的一个错误,在此表示严重感谢
---更多参见:DB2 SQL 精要
----声明:转载请注明出处。
----last update at 2010.5.7
----write by wave at 2009.9.23
----end

按明细统计
 select DATE_FORMAT(CREATE_date, '%Y-%m-%d'),CASE PUSH_TYPE WHEN 'm10' THEN '短信10天' 
 WHEN 'm5' THEN '短信5天' 
 WHEN 'm0' THEN '短信当天' 
 WHEN 'w15' THEN '微信15天' 
 WHEN 'w10' THEN '微信10天' 
 WHEN 'w5' THEN '微信5天' 
 WHEN 'w0' THEN '微信当天' 
 WHEN 'd30' THEN 'tts30天' 
 WHEN 'd15' THEN 'tts15天' 
 WHEN 'd10' THEN 'tts10天' 
 WHEN 'd5' THEN 'tts5天' 
 WHEN 'd0' THEN 'tts当天' 
  
 end as PUSH_TYPE,COUNT(1) total 


 from EOC_PLT_PUSH_TIME_RECORD GROUP BY DATE_FORMAT(CREATE_date, '%Y-%m-%d'),PUSH_TYPE
 order by DATE_FORMAT(CREATE_date, '%Y-%m-%d'), PUSH_TYPE


 按天统计
 select DATE_FORMAT(CREATE_date, '%Y-%m-%d'),COUNT(1) total from EOC_PLT_PUSH_TIME_RECORD GROUP BY DATE_FORMAT(CREATE_date, '%Y-%m-%d')
 order by DATE_FORMAT(CREATE_date, '%Y-%m-%d')