MySQL case when then 的使用方法

Posted wgchen~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL case when then 的使用方法相关的知识,希望对你有一定的参考价值。

阅读目录

简单 CASE WHEN 函数

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

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

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

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

如下:

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

优’和 0 数据类型不一致则报错:
[Err] ORA-00932: 数据类型不一致: 应为 CHAR, 但却获得 NUMBER

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

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

格式:

CASE WHEN condition THEN result
 
[WHEN...THEN...]
 
ELSE result
 
END

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

场景1

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

SELECT
    STUDENT_NAME,
    (
		CASE WHEN score < 60 THEN '不及格'
			 WHEN score >= 60 AND score < 80 THEN '及格'
			 WHEN score >= 80 THEN '优秀'
        ELSE '异常' END
	) AS REMARK
FROM
    TABLE

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

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

场景2

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

CREATE TABLE `thtf_students` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `STU_CODE` varchar(255) DEFAULT NULL,
  `STU_NAME` varchar(255) DEFAULT NULL,
  `STU_SEX` int(11) DEFAULT '0',
  `STU_SCORE` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

INSERT INTO `text`.`THTF_STUDENTS` (`id`, `STU_CODE`, `STU_NAME`, `STU_SEX`, `STU_SCORE`) VALUES ('1', 'XM', '小明', '0', '88');
INSERT INTO `text`.`THTF_STUDENTS` (`id`, `STU_CODE`, `STU_NAME`, `STU_SEX`, `STU_SCORE`) VALUES ('2', 'XL', '小磊', '0', '55');
INSERT INTO `text`.`THTF_STUDENTS` (`id`, `STU_CODE`, `STU_NAME`, `STU_SEX`, `STU_SCORE`) VALUES ('3', 'XF', '小峰', '0', '45');
INSERT INTO `text`.`THTF_STUDENTS` (`id`, `STU_CODE`, `STU_NAME`, `STU_SEX`, `STU_SCORE`) VALUES ('4', 'XH', '小红', '1', '66');
INSERT INTO `text`.`THTF_STUDENTS` (`id`, `STU_CODE`, `STU_NAME`, `STU_SEX`, `STU_SCORE`) VALUES ('5', 'XN', '晓妮', '1', '77');
INSERT INTO `text`.`THTF_STUDENTS` (`id`, `STU_CODE`, `STU_NAME`, `STU_SEX`, `STU_SCORE`) VALUES ('6', 'XY', '小伊', '1', '99');

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

SELECT 
    SUM(CASE WHEN STU_SEX = 0 THEN 1 ELSE 0 END) AS MALE_COUNT,
    SUM(CASE WHEN STU_SEX = 1 THEN 1 ELSE 0 END) AS FEMALE_COUNT,
    SUM(CASE WHEN STU_SCORE >= 60 AND STU_SEX = 0 THEN 1 ELSE 0 END) AS MALE_PASS,
    SUM(CASE WHEN STU_SCORE >= 60 AND STU_SEX = 1 THEN 1 ELSE 0 END) AS FEMALE_PASS
FROM thtf_students

场景3

经典行转列,并配合聚合函数做统计。

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

CREATE TABLE `thtf_energy_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `E_CODE` varchar(255) DEFAULT NULL,
  `E_VALUE` decimal(11,2) DEFAULT NULL,
  `E_TYPE` int(5) DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `text`.`THTF_ENERGY_TEST` (`id`, `E_CODE`, `E_VALUE`, `E_TYPE`) VALUES ('1', '北京', '28.50', '0');
INSERT INTO `text`.`THTF_ENERGY_TEST` (`id`, `E_CODE`, `E_VALUE`, `E_TYPE`) VALUES ('2', '北京', '23.51', '1');
INSERT INTO `text`.`THTF_ENERGY_TEST` (`id`, `E_CODE`, `E_VALUE`, `E_TYPE`) VALUES ('3', '北京', '28.12', '2');
INSERT INTO `text`.`THTF_ENERGY_TEST` (`id`, `E_CODE`, `E_VALUE`, `E_TYPE`) VALUES ('4', '北京', '12.30', '0');
INSERT INTO `text`.`THTF_ENERGY_TEST` (`id`, `E_CODE`, `E_VALUE`, `E_TYPE`) VALUES ('5', '北京', '15.46', '1');
INSERT INTO `text`.`THTF_ENERGY_TEST` (`id`, `E_CODE`, `E_VALUE`, `E_TYPE`) VALUES ('6', '上海', '18.88', '0');
INSERT INTO `text`.`THTF_ENERGY_TEST` (`id`, `E_CODE`, `E_VALUE`, `E_TYPE`) VALUES ('7', '上海', '16.66', '1');
INSERT INTO `text`.`THTF_ENERGY_TEST` (`id`, `E_CODE`, `E_VALUE`, `E_TYPE`) VALUES ('8', '上海', '19.99', '0');
INSERT INTO `text`.`THTF_ENERGY_TEST` (`id`, `E_CODE`, `E_VALUE`, `E_TYPE`) VALUES ('9', '上海', '10.05', '0');

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

SELECT 
    E_CODE,
    SUM(CASE WHEN E_TYPE = 0 THEN E_VALUE ELSE 0 END) AS WATER_ENERGY,#--水耗
    SUM(CASE WHEN E_TYPE = 1 THEN E_VALUE ELSE 0 END) AS ELE_ENERGY,  #--电耗
    SUM(CASE WHEN E_TYPE = 2 THEN E_VALUE ELSE 0 END) AS HEAT_ENERGY  #--热耗
FROM 
    THTF_ENERGY_TEST
GROUP BY
    E_CODE

以上是关于MySQL case when then 的使用方法的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL case when 的两种用法

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

mysql case when

mysql复杂查询

mysql操作查询结果case when then else end用法举例

MySQL CASE WHEN语法