Case具有两种格式----简单Case****函数和Case搜索函数。
一. 简单Case函数
类似switch…case
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他'
END
二. Case搜索函数
类似 if…else
CASE
WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他'
END
三.实际应用
3.1 已知数据按照另外一种方式进行分组,分析
国家 | 人口 |
---|---|
中国 | 2000 |
日本 | 500 |
美国 | 2000 |
法国 | 800 |
上表,按各大洲进行统计,如何解决?
1.生成一个带有洲Code的View是一个解决方法,但是这样很难动态的改变统计的方式。
2.采用case…end
SELECT SUM(population),
CASE country WHEN '中国' THEN '亚洲'
WHEN '日本' THEN '亚洲'
WHEN '美国' THEN '北美洲'
ELSE '其他' END
FROM xxxxx
GROUP BY
CASE country
WHEN '中国' THEN '亚洲'
WHEN '日本' THEN '亚洲'
WHEN '美国' THEN '北美洲'
ELSE '其他' END;
3.2 用一个SQL语句完成不同条件的分组。
国家 | 性别 | 人数 |
---|---|---|
中国 | 1 | 50 |
日本 | 1 | 12 |
美国 | 1 | 234 |
中国 | 2 | 150 |
日本 | 2 | 120 |
美国 | 2 | 235 |
上表,统计各个国家的性比人数,怎么实现?
1.用UNION也可以实现用一条语句进行查询。
但是那样增加消耗(两个Select部分),而且SQL语句会比较长;
2.用Case函数来完成
SELECT country,
SUM( CASE
WHEN sex = '1' THEN population
ELSE 0 END), --男性人口
SUM( CASE
WHEN sex = '2' THEN population
ELSE 0 END) --女性人口
FROM xxx GROUP BY country;
3.3 在Check中使用Case函数。
CHECK 约束用于限制列中的值的范围。
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。
例如:
公司A,这个公司有个规定,女职员的工资必须高于1000块。
采用check…case可以在需要的时候添加男职员的要求。
CONSTRAINT check_salary
CHECK ( CASE
WHEN sex = '2' THEN CASE
WHEN salary > 1000 THEN 1
ELSE 0 END
ELSE 1 END = 1 )
3.4 根据条件有选择的UPDATE
例如
有如下更新条件
工资5000以上的职员,工资减少10%
工资在2000到4600之间的职员,工资增加15%
如何解决?
1.采用2次update,有问题,因为工资区间较近,所以最好同时进行
2.采用case…end
UPDATE xxx
SET salary =
CASE WHEN salary >= 5000 THEN salary * 0.9
WHEN salary >= 2000 AND salary < 4600 THEN salary * 1.15
ELSE salary END;
注意:
最后一行的ELSE salary是必需的,要是没有这行,不符合这两个条件的人的工资将会被写成NUll。在Case函数中Else部分的默认值是NULL。
3.5 两个表数据是否一致的检查
在Case函数中,可以使用BETWEEN,LIKE,IS NULL,IN,EXISTS等等。
3.6 在Case函数中使用合计函数
学号(std_id) | 课程(class_id) | 课程名称(class_name) | 主修(main_class_flg) |
---|---|---|---|
100 | 1 | 通原 | y |
200 | 2 | 最优化 | y |
300 | 3 | 电磁场 | n |
400 | 4 | DSP | y |
SELECT std_id, MAX(class_id) AS main_class
FROM Studentclass
GROUP BY std_id HAVING COUNT(*) = 1;
SELECT std_id, class_id AS main_class
FROM Studentclass
WHERE main_class_flg = 'Y'
使用case整合后
SELECT std_id,
CASE
WHEN COUNT(*) = 1 THEN MAX(class_id)
ELSE MAX(CASE WHEN main_class_flg = 'Y' THEN class_id
ELSE END )
END AS main_class
FROM Studentclass GROUP BY std_id;
3.7 小结
一是在显示查询结果时可以灵活的组织格式;
二是有效避免了多次对同一个表或几个表的访问。