简单 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

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐