数据准备
CREATE TABLE `student` (
`name` varchar(10) DEFAULT NULL,
`subject` varchar(10) DEFAULT NULL,
`score` int(10) DEFAULT NULL,
`dayTime` varchar(10) DEFAULT NULL,
`monthTime` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
INSERT INTO student VALUES('lisi','eng',90,'20240708','202406');
INSERT INTO student VALUES('liming','math',90,'20240808','202407');
INSERT INTO student VALUES('zhangsan','math',93,'20240706',null);
INSERT INTO student VALUES('tom','eng',80,'20240806',null);
select *
from student
where score >= 90 and
case
when name in ('lisi','liming')then monthTime = date_format(date_add(dayTime,interval - 1 month),'%Y%m')
else 1=1 end
运行结果
name | subject | score | dayTime | monthTime |
---|---|---|---|---|
lisi | eng | 90 | 20240708 | 202406 |
liming | math | 90 | 20240808 | 202407 |
zhangsan | math | 93 | 20240706 | null |
语法说明
在看一个老的需求时,发现当时在where条件里面使用了CASE WHEN,一时间没想起来当时为什么写一个where里面嵌套使用CASE WHEN,所以现在记录一下:
- where中使用CASE WHEN ,可以给符合WHEN条件的数据添加特定的筛选条件;
- 上面的表中,有的monthTime为NULL,有的不为NULL,对有的学生需要筛选score和monthTime,有的只需要筛选score,要求把这两种数据在一个查询中同时返回,还要避免UNION,优化SQL执行效率,就可以在where中使用CASE WHEN来实现;
- CASE WHEN根据符合分支判断的结果,把不同的筛选结果,添加到不同的学生的where的条件后面,实现每个学生根据不同的筛选条件单独查询,但是结果一块返回的效果;