0
点赞
收藏
分享

微信扫一扫

MySQL case when then 的使用方法


阅读目录

  • 简单 CASE WHEN 函数
  • 场景1
  • 场景2
  • 场景3

简单 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输出结果。

MySQL case when then 的使用方法_database

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

MySQL case when then 的使用方法_database_02

场景3

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

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

MySQL case when then 的使用方法_数据类型_03

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 的使用方法_数据库_04


举报

相关推荐

0 条评论