平时sql
开发中,case when
是非常常用的,下面介绍开发中case when
的两种写法
case when
的字段值为枚举类型时
这里我们以用户的性别为例,有用户表user
,其中有性别字段sex
有三个枚举值 0、1、2
首先我们创建user表,建表语句如下
CREATE TABLE `user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`name` varchar(20) DEFAULT NULL COMMENT '用户名',
`sex` tinyint(4) DEFAULT NULL COMMENT '性别,0:男,1:女,2:未知',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入数据
INSERT INTO `user` (`id`, `name`, `sex`) VALUES ('1', '李浩', '0');
INSERT INTO `user` (`id`, `name`, `sex`) VALUES ('2', '张萌', '1');
INSERT INTO `user` (`id`, `name`, `sex`) VALUES ('3', '王洁', '1');
INSERT INTO `user` (`id`, `name`, `sex`) VALUES ('4', '苏源', '2');
查询用户表,可以看到数据如下
下面我们使用case when
使得查询结果中sex
的值显示为汉字
1)0:男
2)1:女
3)2:未知
查询sql
如下
select id
,name
,case sex when 0 then '男' when 1 then '女' else '未知' end as sex
from user;
执行后查询结果如下
case when
的字段值不是枚举类型时,而是根据一定的条件进行处理
我们以学生成绩表为例,student_score
有三个字段,id
(自增主键)、student_name
(姓名)、score
(分数)
首先我们创建表,sql
语句如下
CREATE TABLE `score_info` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`student_name` varchar(20) DEFAULT NULL COMMENT '姓名',
`score` int(11) DEFAULT NULL COMMENT '分数',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入若干条数据
INSERT INTO `score_info` (`id`, `student_name`, `score`) VALUES ('1', '张三', '80');
INSERT INTO `score_info` (`id`, `student_name`, `score`) VALUES ('2', '李四', '59');
INSERT INTO `score_info` (`id`, `student_name`, `score`) VALUES ('3', '王五', '75');
INSERT INTO `score_info` (`id`, `student_name`, `score`) VALUES ('4', '张萌', '90');
INSERT INTO `score_info` (`id`, `student_name`, `score`) VALUES ('5', '李子天', '65');
INSERT INTO `score_info` (`id`, `student_name`, `score`) VALUES ('6', '孙静芙', '50');
INSERT INTO `score_info` (`id`, `student_name`, `score`) VALUES ('7', '陈妙语', '96');
查询成绩表,可以看到数据如下
现在我们想使用case when 对学生成绩划分等级,规则如下
1)小于60分:不及格
2)大于等于60,小于80分:良好
3)大于80分:优秀
sql如下
select id
,student_name
,score
,case
when score < 60 then '不及格'
when score >= 60 and score < 80 then '良好'
when score >= 80 then '优秀'
end as rank
from score_info
order by score desc;
执行后查询结果如下
最后,总结一下两种写法的不同
1)枚举型:case 字段 when 值 then 结果
2)条件型:case when 条件(字段) then 结果