case when then else end oracle,mysql 中 case when then .... else end 的简单使用

数据SQL CASE 表达式是一种通用的条件表达式,类似于其它语言中的 if/else 语句。

CASE WHEN condition THEN result

WHEN condition THEN result

.............

[WHEN ...]

[ELSE result]

END

CASE 子句可以用于任何表达式可以有效存在的地方。 condition 是一个返回boolean 的表达式。 如果结果为真,那么 CASE 表达式的结果就是符合条件的 result。 如果结果为假,那么以相同方式搜寻任何随后的 WHEN 子句。 如果没有 WHEN condition 为真,那么 case 表达式的结果就是在 ELSE 子句里的值。 如果省略了 ELSE 子句而且没有匹配的条件, 结果为 NULL。

或其语法为:

简单Case函数

CASE sex

WHEN '1' THEN '男'

WHEN '2' THEN '女'

ELSE '其他' END

建议都使用第一种,少记点,也好理解。

例子:如下某学校在2005和2006年比赛的数据,

f693305483666be2ee67021918ceab36.png

1)将 win_loss 中的胜,负,平 都变成 对应的 ‘win’,'loss','tie'

selectdate_year,case

when win_loss='胜' then 'win'

when win_loss='负' then 'loss'

else 'tie'

endwin_lossfrom scores;

e42ca5c5347f67e7ca9cf6b18ab568cb.png

2) 假设胜得3分,平得一分,负得0分,统计每一年的得分

selectdate_year ,sum(case when win_loss='胜' then 3 when win_loss='平' then 1 else 0 end) scorefrom scores group by date_year;

bb01b8753c921849e3bf3b726e6894e4.png

3)统计每一年的 胜场数,平场数 和 负场数

selectdate_year ,sum(case when win_loss='胜' then 1 else 0 end ) '胜场数',sum(case when win_loss='负' then 1 else 0 end) '负场数',sum(case when win_loss='平' then 1 else 0 end) '平场数'

from scores group by date_year;

a477a34a429e8c6497c8468c91c5e06e.png

由例一可以发现,使用 case when  then  else then 时 是每一条语句都去执行一遍。

例二:数据集如下:

39703f620deca5e3f286b91218bd48ea.png

试试看:

select tname, case when ttype = '语文' then tscor else 0 end from testScore

0f5647ec10bcb3f9cc6477d0efde73d0.png

1)用一行来显示一个学生的成绩

selecttname, tscorfrom testScore group by tname;

c2ece9bff3f79d434d8413dd8850f781.png

selecttname,

(case when ttype='语文' then tscor else 0 end) '语文',

(case when ttype ='数学' then tscor else 0 end) '数学',

(case when ttype ='英语' then tscor else 0 end) '英语'

from testScore group by tname;

0d0eaf9af3047bd75aacac2ec29ecb60.png

selecttnameas '姓名',max(case ttype when '语文' then tscor else 0 end) '语文',max(case ttype when '数学' then tscor else 0 end) '数学',max(case ttype when '英语' then tscor else 0 end) '英语'

fromtestScoregroup by tname;

selecttname,max(case when ttype='语文' then tscor else 0 end) '语文',max(case when ttype ='数学' then tscor else 0 end) '数学',max(case when ttype ='英语' then tscor else 0 end) '英语'

from testScore group by tname;

这两是是同样的结果。

b5a1d39b5d16c8b648087df4d7af50cd.png

对比上面,聚和函数的作用。。。。??

2)统计学生文科,理科的总分。

select tname as '姓名',case

when ttype='数学' then '理科' else '文科' end as '科别',sum(tscor) as '总分'

fromtestScoregroup bytname,case

when ttype='数学' then '理科' else '文科' end ;

0bd9f663e560a43dafa852545f6df6ee.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值