您的位置:首页 > 数据库

sql case when then

2017-01-12 18:10 351 查看


SQL中的IF ELSE(CASE语句的使用)

大家对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')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: