case函数通常也被称为:流程控制函数
主要有两种形式
- 简单case函数
通常用于情况不多且可枚举出来的情况
通常形式如下:
CASE <col_name>
WHEN <value1> THEN <result1>
WHEN <value2> THEN <result2>
...
ELSE <result>
END
例如:
CASE sex
WHEN '0' THEN '男'
WHEN '1' THEN '女'
ELSE '其他' END
- case搜索函数
类似if判断,case搜索函数可以写判断,并且只会返回第一个符合条件的值,其他case被忽略
通常形式如下:
CASE
WHEN <条件1> THEN <结果1>
WHEN <条件2> THEN <结果2>
...
ELSE <结果>
END
例如:
case
when score<60 then"不及格"
when score <=70 then "及格"
when score<=80 then "中等"
when score<=90 then "优良"
else "优秀"
end
case可以帮助我们解决许多问题,下面可以列举几种适用的场景
- 说到分类,在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
实际例子
SELECT a.id
,(case WHEN ASCII(SUBSTR(a.cgsqdhnew,1,1))>65 THEN '字母' ELSE '数值' END) AS ww
FROM formtable_main_200_dt1 a
WHERE 1=1
SELECT (case WHEN ascii(substr(b.cgsqdhnew,1,1))>65 THEN b.Cgsqdhnew ELSE (
SELECT BH
FROM formtable_main_240
WHERE requestid = b.Cgsqdhnew) END) AS Cgsqdhnew
FROM table