MySQL case when then 的使用方法(想当于if判断)

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

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值