SQL中CASE关键字的使用
使用方法
代码示例
CASE关键字有两种使用方法,分别是‘简单case函数’和‘case搜索函数’
简单case函数
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
case搜索函数
CASE sex
WHEN sex='1' THEN '男'
WHEN sex='2' THEN '女'
ELSE '其他' END
分析说明
- 简单case函数是case搜索函数的真子集
- 简单case函数的使用方法与一些高级语言(如:java)中的switch语句相似:CASE给定匹配字段,WHEN给出具体的字段值,如果匹配到后返回THEN值。
- 简单case函数其实就是case搜索函数的‘=’逻辑的实现。case搜索函数可以实现简单case函数的所有功能,而简单case函数却不可实现case搜索函数的‘=’逻辑以外的功能。
- case函数匹配原则
- case函数与switch的不同在于case仅返回第一个匹配到的结果,而switch则会在没有中断的情况下继续后面的判断,将会执行所有匹配的结果。
- case搜索函数比简单case函数更加灵活
- case搜索函数与简单case函数相比的灵活之处在于可以在WHEN中书写判断式。
case关键字的一些妙用
替换
在某些时候,我们需要在查询结果中使用字符串替换掉数据库中原本存储的字符串,如:数据库中的性别存储方式是以‘1’表示‘男’、‘0’表示‘女’。如果不进行替换,则查询结果中只会包含‘1’和‘0’,但我们希望能以‘男’和‘女’的形式进行展示。此时我们就可以使用case语句来进行实现:
SELECT
name,
CASE gender
WHEN '1' THEN '男'
WHEN '0' THEN '女'
ELSE '其他' END
FROM
T_USER
分类
说到分类,在SQL中应该首选GROUP BY。然而GROUP BY也不是万能的,如果有进行范围分类,就有些力不从心了,需要与CASE配合才能完成。比如:当前用户表(T_USER)中有100万条数据,用户记录中有年龄字段(age),我们现在划分年龄小于18岁的是未成年成、大于等于18岁小于40岁的年轻人、大于等于40岁小于60岁的是中年人、大于等于60岁的是老年人,现需要统计各类人群的数量。
SELECT
CASE age
WHERE age < 18 THEN '未成年人'
WHERE age >= 18 AND age < 40 THEN '年轻人'
WEHRE age >= 40 AND age < 60 THEN '中年人'
WHERE age >= 60 THEN '老年人'
ELSE '其他' END '人群类型',
COUNT(*) '数量'
FROM T_USER
GROUP BY
CASE age
WHERE age < 18 THEN '未成年人'
WHERE age >= 18 AND age < 40 THEN '年轻人'
WEHRE age >= 40 AND age < 60 THEN '中年人'
WHERE age >= 60 THEN '老年人'
ELSE '其他' END
降维
这里的降维主要是降低数据库查询次数,我们可以将数据库的每个select作为数据的一个维度,维度越高,数据库服务器处理该数据的资源消耗就越多,子查询就是一个极度消耗资源的查询方式。这里就给出一个减少子查询的案例,如:同样是“分类”栏目下的那个表(T_USER),人群分类相同,另外说明:用户表中的用户来自于国内的不同省(province)。现在需要统计的是,各省的各类人群的数量。
SELECT province,
SUM( CASE age WHERE age < 18 THEN 1 ELSE 0 END) '未成年人',
SUM( CASE age WHERE age >= 18 AND age < 40 THEN 1 ELSE 0 END) '年轻人',
SUM( CASE age WHERE age >= 40 AND age < 60 THEN 1 ELSE 0 END) '中年人',
SUM( CASE age WHERE age >= 60 THEN 1 ELSE 0 END) '老年人',
FROM T_USER
GROUP BY
province