SQL中得CASE及其使用
CASE 表达式是从 SQL-92 标准开始被引入的。CASE WHEN语句是SQL中的条件表达式,它提供了一种简单的方式来根据不同的条件执行不同的操作。在实际情境中,我们可能需要在数据查询中进行一些简单的转换或计算。CASE WHEN就可以方便地帮助我们完成这些工作。在 CASE 表达式里,可以使用 BETWEEN 、LIKE和 < 、> 等便利的谓词组合,以及能嵌套子查询的 IN 和 EXISTS 谓词。
CASE得使用方法主要分为以下两类:
1:普通case函数:
CASE <表达式> WHEN <值1> THEN <操作> WHEN <值2> THEN <操作> ... ELSE <操作> END
2:搜索case函数
CASE WHEN <条件1> THEN <命令> WHEN <条件2> THEN <命令> ... ELSE commands END
这上述语法中,我们首先使用CASE关键字开头,然后根据不同的条件使用WHEN关键字,并在每个条件后面指定结果。如果所有条件都不满足,就返回ELSE子句中指定的结果。最后使用END关键字闭合该CASE语句。需要注意的是,条件和结果都可以是任何SQL表达式。
例子1:
使用CASE WHEN语句进行数据分组,例如,我们想要基于年龄分组,分成18到25岁、26到35岁、36到45岁和45岁以上等四组。可以使用以下语句: SELECT COUNT(*) AS people_count, CASE WHEN age >= 18 AND age <= 25 THEN '18-25' WHEN age > 25 AND age <= 35 THEN '25-35' WHEN age > 35 AND age <= 45 THEN '36-45' ELSE '45+' END AS age_group FROM people GROUP BY age_group; 这个查询可以对people表中的人员按照不同的年龄段进行分组,并计算在每个组中人数的总和
例子2:
一条SQL实现不同条件的统计 SELECT pref_name AS '县名', SUM( CASE WHEN sex=1 THEN population ELSE 0 END ) AS '男' SUM( CASE WHEN sex=2 THEN population ELSE 0 END ) AS '女' FROM poptlb GROUP By pref_name
结果如下图所示:

例子3:
使用搜索的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 )
例子4:
检查表中字段值是否一致 select name, ( case when desciption in(select description from t_user2) then '一致' else '不一致' end ) 比较结果 from t_user1
例子5:行转列:首先:将表中数据按照每个学生姓名 、科目、成绩进行排序,数据如下:

// 使用普通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 WHEN语句是SQL中一种非常重要的条件表达式。在实际情况中,我们可能需要根据某种规则对数据进行转换、分类、计算等操作。在这种情况下,可以使用CASE WHEN语句非常方便地完成这些操作。
本文参考得是以下两篇优秀得文章,在此记录两者得观点一作个人日常学习所用。
浙公网安备 33010602011771号