服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - 一篇文章带你了解SQL之CASE WHEN用法详解

一篇文章带你了解SQL之CASE WHEN用法详解

2021-09-17 16:36_Rt Mysql

本文介绍下,在mysql数据库中,有关case when语句的用法,介绍了case when语句的基础知识,并提供了相关实例,供大家学习参考,有需要的朋友不要错过

简单CASE WHEN函数:

  1. CASE SCORE WHEN 'A' THEN '优' ELSE '不及格' END
  2. CASE SCORE WHEN 'B' THEN '良' ELSE '不及格' END
  3. CASE SCORE WHEN 'C' THEN '中' ELSE '不及格' END

等同于,使用CASE WHEN条件表达式函数实现:

  1. CASE WHEN SCORE = 'A' THEN '优'
  2. WHEN SCORE = 'B' THEN '良'
  3. WHEN SCORE = 'C' THEN '中' ELSE '不及格' END

THEN后边的值与ELSE后边的值类型应一致,否则会报错。如下:

  1. CASE SCORE WHEN 'A' THEN '优' ELSE 0 END

'优'和0数据类型不一致则报错:

[Err] ORA-00932: 数据类型不一致: 应为 CHAR, 但却获得 NUMBER

简单CASE WHEN函数只能应对一些简单的业务场景,而CASE WHEN条件表达式的写法则更加灵活。

CASE WHEN条件表达式函数:类似JAVA中的IF ELSE语句。

格式:

  1. CASE WHEN condition THEN result
  2.  
  3. [WHEN...THEN...]
  4.  
  5. ELSE result
  6.  
  7. END

condition是一个返回布尔类型的表达式,如果表达式返回true,则整个函数返回相应result的值,如果表达式皆为false,则返回ElSE后result的值,如果省略了ELSE子句,则返回NULL。

下面介绍几种常用场景。

场景1:有分数score,score<60返回不及格,score>=60返回及格,score>=80返回优秀

  1. SELECT
  2. STUDENT_NAME,
  3. (CASE WHEN score < 60 THEN '不及格'
  4. WHEN score >= 60 AND score < 80 THEN '及格'
  5. WHEN score >= 80 THEN '优秀'
  6. ELSE '异常' END) AS REMARK
  7. FROM
  8. TABLE

 注意:如果你想判断score是否null的情况,WHEN score = null THEN '缺席考试',这是一种错误的写法,正确的写法应为:

  1. CASE WHEN score IS NULL THEN '缺席考试' ELSE '正常' END

场景2:现老师要统计班中,有多少男同学,多少女同学,并统计男同学中有几人及格,女同学中有几人及格,要求用一个SQL输出结果。

表结构如下:其中STU_SEX字段,0表示男生,1表示女生。

STU_CODE STU_NAME STU_SEX STU_SCORE
XM 小明 0 88
XL 小磊 0 55
XF 小峰 0 45
XH 小红 1 66
XN 晓妮 1 77
XY 小伊 1 99
  1. SELECT
  2. SUM (CASE WHEN STU_SEX = 0 THEN 1 ELSE 0 END) AS MALE_COUNT,
  3. SUM (CASE WHEN STU_SEX = 1 THEN 1 ELSE 0 END) AS FEMALE_COUNT,
  4. SUM (CASE WHEN STU_SCORE >= 60 AND STU_SEX = 0 THEN 1 ELSE 0 END) AS MALE_PASS,
  5. SUM (CASE WHEN STU_SCORE >= 60 AND STU_SEX = 1 THEN 1 ELSE 0 END) AS FEMALE_PASS
  6. FROM
  7. THTF_STUDENTS

输出结果如下:

MALE_COUNT FEMALE_COUNT MALE_PASS FEMALE_PASS
3 3 1 3

场景3:经典行转列,并配合聚合函数做统计

现要求统计各个城市,总共使用了多少水耗、电耗、热耗,使用一条SQL语句输出结果

有能耗表如下:其中,E_TYPE表示能耗类型,0表示水耗,1表示电耗,2表示热耗

E_CODE E_VALUE E_TYPE
北京 28.50 0
北京 23.51 1
北京 28.12 2
北京 12.30 0
北京 15.46 1
上海 18.88 0
上海 16.66 1
上海 19.99 0
上海 10.05 0
  1. SELECT
  2. E_CODE,
  3. SUM(CASE WHEN E_TYPE = 0 THEN E_VALUE ELSE 0 END) AS WATER_ENERGY,--水耗
  4. SUM(CASE WHEN E_TYPE = 1 THEN E_VALUE ELSE 0 END) AS ELE_ENERGY,--电耗
  5. SUM(CASE WHEN E_TYPE = 2 THEN E_VALUE ELSE 0 END) AS HEAT_ENERGY--热耗
  6. FROM
  7. THTF_ENERGY_TEST
  8. GROUP BY
  9. E_CODE

 输出结果如下

E_CODE WATER_ENERGY ELE_ENERGY HEAT_ENERGY
北京 40.80 38.97 28.12
上海 48.92 16.66 0

场景4:CASE WHEN中使用子查询

根据城市用电量多少,计算用电成本。假设电能耗单价分为三档,根据不同的能耗值,使用相应价格计算成本。

 价格表如下:

P_PRICE P_LEVEL P_LIMIT
1.20 0 10
1.70 1 30
2.50 2 50

当能耗值小于10时,使用P_LEVEL=0时的P_PRICE的值,能耗值大于10小于30使用P_LEVEL=1时的P_PRICE的值...

  1. CASE WHEN energy <= (SELECT P_LIMIT FROM TABLE_PRICE WHERE P_LEVEL = 0) THEN (SELECT P_PRICE FROM TABLE_PRICE WHERE P_LEVEL = 0)
  2. WHEN energy > (SELECT P_LIMIT FROM TABLE_PRICE WHERE P_LEVEL = 0) AND energy <= (SELECT P_LIMIT FROM TABLE_PRICE WHERE P_LEVEL = 1) THEN (SELECT P_PRICE FROM TABLE_PRICE WHERE P_LEVEL = 1)
  3. WHEN energy > (SELECT P_LIMIT FROM TABLE_PRICE WHERE P_LEVEL = 1) AND energy <= (SELECT P_LIMIT FROM TABLE_PRICE WHERE P_LEVEL = 2) THEN (SELECT P_PRICE FROM TABLE_PRICE WHERE P_LEVEL = 2)

场景5:结合max聚合函数

一篇文章带你了解SQL之CASE WHEN用法详解

一篇文章带你了解SQL之CASE WHEN用法详解

CASE WHEN 函数使用起来简单易懂,此篇文章只作了简单的使用介绍,还需在实际工作中根据业务场景不同来灵活使用。

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!

原文链接:https://blog.csdn.net/rongtaoup/article/details/82183743

延伸 · 阅读

精彩推荐
  • Mysql简介操作MySQL日志的一些方法

    简介操作MySQL日志的一些方法

    这篇文章主要介绍了操作MySQL日志的一些方法,对日志的删除操作做了重点讲解,需要的朋友可以参考下 ...

    MYSQL教程网1672020-05-13
  • Mysql一次神奇的MySQL死锁排查记录

    一次神奇的MySQL死锁排查记录

    这篇文章主要给大家介绍了一次神奇的MySQL死锁排查的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Mysql具有一定的参考学习价值,需...

    咖啡拿铁3932020-09-14
  • MysqlMySQL字符编码设置方法

    MySQL字符编码设置方法

    这篇文章主要介绍了MySQL字符编码设置方法的相关资料,需要的朋友可以参考下 ...

    Pinnsvin5322020-06-11
  • MysqlLinux手动部署远程的mysql数据库的方法详解

    Linux手动部署远程的mysql数据库的方法详解

    这篇文章主要介绍了Linux手动部署远程的mysql数据库的方法详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可...

    爱学习的小白菜!6872021-03-09
  • MysqlMySQL慢查询之pt-query-digest分析慢查询日志

    MySQL慢查询之pt-query-digest分析慢查询日志

    这篇文章主要介绍了关于MySQL慢查询之pt-query-digest分析慢查询日志的相关资料,文中介绍的非常详细,对大家具有一定的参考价值,需要的朋友们下面来一...

    成九2172020-07-19
  • MysqlMysql数据库性能优化之子查询

    Mysql数据库性能优化之子查询

    这篇文章主要介绍了Mysql数据库性能优化之子查询的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下...

    Sniper_ZL4872020-07-08
  • MysqlMysql中新建用户及授权的方法分享

    Mysql中新建用户及授权的方法分享

    这篇文章给大家汇总介绍了Mysql中新建用户及授权的方法,首先介绍的是作者自己的项目经历,后面附上了参考文章,希望能对大家学习mysql有所帮助。 ...

    MYSQL教程网4952020-06-17
  • MysqlMySQL架构体系知识点总结

    MySQL架构体系知识点总结

    在本篇内容里我们给大家整理了关于MySQL架构体系的相关知识点内容以及相关实例,需要的朋友们学习下。...

    laozhang5362020-09-12