前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[数据库] 一文搞懂case when所有使用场景「建议收藏」

[数据库] 一文搞懂case when所有使用场景「建议收藏」

作者头像
全栈程序员站长
发布2022-10-04 10:19:30
6870
发布2022-10-04 10:19:30
举报

大家好,又见面了,我是你们的朋友全栈君。

前几天,为了给产品分析当前用户数据结构,写sql的时候使用到了case when,今天来总结一下case when 的使用方法,以此为戒,感觉写的不好请拍砖,感觉写的还可以,给哥们点个赞,或者回复一下,让我意识到我不是一个人在战斗,好了废话不多说了,进入正题。

关于case when的使用情况,我总结下来有三种,第一、等值转换,第二、范围转换,第三、列转行操作。

等值转换

咱们在设计数据库的时候总是会把用户的性别用int存储(’0’为女,’1’为男),但是怎么把它转换成汉字显示呢?

原始表数据

[数据库] 一文搞懂case when所有使用场景「建议收藏」
[数据库] 一文搞懂case when所有使用场景「建议收藏」

SQL语句

select name as ‘名字’, (case sex when 0 then ‘女’ else ‘男’ end) as ‘性别’ from test.student;

ps.最后的 ‘end’ 别丢了,我刚开始使用的时候我就有这个毛病,并且一般的case when语句都会比较长,最好添加小括号包起来,这样更容易阅读。

查询结果

[数据库] 一文搞懂case when所有使用场景「建议收藏」
[数据库] 一文搞懂case when所有使用场景「建议收藏」

范围转换

有的时候,也会遇到这种情况,按照用户成绩显示优(90+)、良(80-90)、及格(60-80)、未及格(60-),这个跟第一个不同的是,他是一个分数的范围,要怎么转换成汉子显示呢?你可能觉得很简单,不就是吧when那换成条件吗?先打住咱们往下看

原始表数据

[数据库] 一文搞懂case when所有使用场景「建议收藏」
[数据库] 一文搞懂case when所有使用场景「建议收藏」

SQL语句

select name as ‘姓名’ ,(case score when score>=90 then ‘优’ when score>=80 then ‘良’ when score>=60 then ‘及格’ else ‘不及格’ end) as ‘等级’ from test.stu_score;

这样写对不?

这个查出来的结果是

[数据库] 一文搞懂case when所有使用场景「建议收藏」
[数据库] 一文搞懂case when所有使用场景「建议收藏」
[数据库] 一文搞懂case when所有使用场景「建议收藏」
[数据库] 一文搞懂case when所有使用场景「建议收藏」

这是为啥呢?想明白了吗?

因为 case when就像一个 switch case语句一样,如果你在case后填了东西,它会拿后它跟when 对比,咱们的 写的case 后写=了 score 而when后面写了score>=90 ,然而,’score’ 等于 ‘score>=90’吗? 显然不等于,那该怎么写呢?

select name as ‘姓名’ ,(case score when score>=90 then ‘优’ when score>=80 then ‘良’ when score>=60 then ‘及格’ else ‘不及格’ end) as ‘等级’ from test.stu_score;

[数据库] 一文搞懂case when所有使用场景「建议收藏」
[数据库] 一文搞懂case when所有使用场景「建议收藏」

列转行操作

还是用学生的例子吧,现在有图1学生成绩数据, 现在要怎么按图2显示出来呢?

图1

[数据库] 一文搞懂case when所有使用场景「建议收藏」
[数据库] 一文搞懂case when所有使用场景「建议收藏」

图2

[数据库] 一文搞懂case when所有使用场景「建议收藏」
[数据库] 一文搞懂case when所有使用场景「建议收藏」

第一步 先按照科目分开, 符合条件的设置分数,不符合的给置零。

select name as ‘姓名’ ,(case course when ‘语文’ then score else 0 end) as ‘语文’ ,(case course when ‘数学’ then score else 0 end) as ‘数学’ ,(case course when ‘英语’ then score else 0 end) as ‘英语’ from test.course_score

[数据库] 一文搞懂case when所有使用场景「建议收藏」
[数据库] 一文搞懂case when所有使用场景「建议收藏」

然后再按照名字group by ,对分数求max。

select name as ‘姓名’ ,max(case course when ‘语文’ then score else 0 end) as ‘语文’ ,max(case course when ‘数学’ then score else 0 end) as ‘数学’ ,max(case course when ‘英语’ then score else 0 end) as ‘英语’ from test.course_score group by name;

[数据库] 一文搞懂case when所有使用场景「建议收藏」
[数据库] 一文搞懂case when所有使用场景「建议收藏」

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月5日 下,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档