线下笔试中碰到了一个根据成绩在查询结果中新增一列显示ABCD等级这个需求,当时忘记了case when的用法。

case函数

CASE expr WHEN v1 THEN r1 [WHEN v2 THEN r2] [ELSE rn] END

该函数表示,若expr值等于某个vn,则返回对应位置THEN后面的结果;若与所有值都不想等,则返回ELSE后面的rn。
使用 CASE value WHEN语句执行分支操作,输入语句如下:

select case 2 when 1 then 'one' when 2 then 'two' else 'more' end;

CASE后面的值为2,与第二条分支语句WHEN后面的值相等,因此返回结果为"two"。

CASE WHEN v1 THEN r1 [WHEN v2 THEN r2] [ELSE rn] END

该函数表示,若某个vn值为TRUE,则返回对应位置THEN后面的结果;若所有值都不为TRUE,则返回ELSE后的rn。
使用CASE WHEN语句执行分支操作,输入语句如下:

由于1<0的结果为FALSE,因此函数返回值为ELSE后面的"false"。

笔试题回顾

当时是个学生表和成绩表的连表查询SQL,具体题目已经忘了,不过我使用下面这个表结构效果也是一样的,本质都是根据数字打分。
比如说下面这张表

我现在要根据年龄进行等级划分:

  • 当age>25,level=A
  • 当age>22 and age<=25,level=B
  • 否则level=C
    SQL如下:
select s.id,s.sno,s.name,s.age,s.classId,
case
	when s.age>25 then 'A'
	when s.age>22 and s.age<=25 then 'B'
	else 'C'
end as level
from student s