作用: 可以使用它们在数据库进行判断功能,跟代码中的if...else功能一样.但是,它们又存在差异,下面就来讲它们的具体作用和差别。
(一)普通case函数
CASE <表达式>
WHEN <值1> THEN <操作>
WHEN <值2> THEN <操作>
... ELSE <操作>
END
(二 )搜索case函数
CASE
WHEN <条件1> THEN <命令>
WHEN <条件2> THEN <命令>
... ELSE commandsEND
需求: 将下图的数据按照"洲"进行统计总人数
源数据
(一)方式一: 使用普通的case函数进行统计
select (
case name
when '中国' then '亚洲'
when '日本' then '亚洲'
when '美国' then '北美洲'
when '加拿大' then '北美洲'
else '其他' end
) 洲, sum(population) 总数
from t_country
GROUP BY
( case name
when '中国' then '亚洲'
when '日本' then '亚洲'
when '美国' then '北美洲'
when '加拿大' then '北美洲'
else '其他' end
)
统计结果:
统计结果
(二)方式二: 使用搜索的case函数进行统计
select (
case
when name in('中国','日本') then '亚洲'
when name in('美国','加拿大') then '北美洲'
else '其他' end
) 洲, sum(population) 总数
from t_country
GROUP BY
( case
when name in('中国','日本') then '亚洲'
when name in('美国','加拿大') then '北美洲'
else '其他' end
)
统计结果
统计结果
(一)需求: 将工资低于3000的员工涨幅工资20%,工资等于高于3000的员工涨幅8%,数据如下:
源数据
可能看到此需求,有人第一想法就是直接通过如下两条update语句直接更新:
update t_salary set salary = salary + (salary * 0.2) where salary < 3000;
update t_salary set salary = salary + (salary * 0.08) where salary >= 3000;
但是,如果是这样执行的话实际上会存在问题,比如:原来工资在2900的员工,执行完第一条语句后工资会变成3480,此时,再执行第二条更新语句,因为满足工资大于三千,则又会去添加多8%的工资,这样明显就是不符合我们的需求的,所以,如果想完成这个需求,又不想写太复杂的sql,可以通过case函数完成这个功能。
(二)使用搜索的case函数进行分条件修改(此处不能使用简单case函数,因为简单case函数不能判断带范围的条件)
update t_salary
set
salary = ( case
when salary < 3000 then salary + salary * 0.2
when salary >= 3000 then salary + salary * 0.08
else salary
end
)
(三)分条件修改后结果
结果
(一)需求: 判断两个表中name字段值是否一致,并返回结果,数据如下:
源数据
(二)使用搜索的case函数进行分条件修改(此处不能使用简单case函数,因为简单case函数不能判断带范围的条件)
select name,
( case
when desciption in(select description from t_user2) then '一致'
else '不一致'
end
) 比较结果from t_user1
(三)比较结果:
比较结果
(一)需求: 将表中数据按照每个学生姓名 、科目、成绩进行排序,数据如下:
(二)使用case函数转换
// 使用普通case函数
SELECT NAME,
max( CASE class WHEN '语文' THEN grade ELSE 0 END ) 语文,
max( CASE class WHEN '数学' THEN grade ELSE 0 END ) 数学,
max( CASE class WHEN '英语' THEN grade ELSE 0 END ) 英语
FROM
t_source GROUP BY
NAME// 使用搜索case函数
SELECT NAME,
max( CASE WHEN class = '语文' THEN grade ELSE 0 END ) 语文,
max( CASE WHEN class = '数学' THEN grade ELSE 0 END ) 数学,
max( CASE WHEN class = '英语' THEN grade ELSE 0 END ) 英语
FROM
t_source GROUP BY
NAME
(三)转换结果
转换结果
通过上面的案例可看到,普通的case函数写法相对简洁,但是功能也相对简单,搜索case函数的功能更加强大,具体如下:
1、简单case函数判断条件只能是等于,而搜索case函数的条件可以是子查询,In,大于、等于等等。
2、如果只是使用简单的条件分组,可以选择普通case函数,如果需要判断更多的场景,则选择搜索case更好。
如果你想亲自实践,需要本文章的测试数据,可以私信回复: 【测试数据】即可
看到此处,你应该对Case函数有了更深入的认识,但是、关于Case函数的使用远远不止这一篇文章描述的,还需要我们在实践中去发现更多的可能,如果你看完本文觉得有疑问或者本文有错误的地方,欢迎私信或者在下方留言指出。
码字不易、如果你觉得本文对你有一点点帮助,可以点赞和关注!