Case具有两种格式:简单Case函数和Case搜索函数。
– 简单Case函数
简单Case表达式的作用是: 使用表达式确定返回值:
select id,name, case sex when '1' then '男' when '2' then '女' else '其他' end from student
– 搜索Case函数:
Case函数(Case搜索函数): 判断表达式的真假,如果为真,返回结果;如果为假,返回else值;如果未定义else值,则返回空值(使用条件确定返回值);
select id,name, CASE WHEN sex = '1' THEN '男' WHEN sex = '2' THEN '女' ELSE '其他' END from student
这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。
还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略
Case when 的用法: 一旦满足了某一个WHEN, 则这一条数据就会退出CASE WHEN , 而不再考虑 其他CASE;
比如下面 SQL,将无法得到第二个when的结果:(不会获取到 ‘差’ 这个值)
sql如下
case when colum in ('a', 'b') then '优秀' when colum in ('a') then '差' else '其他' end
case函数的一些示例
创建表 CREATE TABLE `table_a` ( `id` INT(10) NOT NULL AUTO_INCREMENT, `country` VARCHAR(100) DEFAULT NULL, `population` INT(10) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8; INSERT INTO table_A (country,population) VALUES('中国',600); INSERT INTO table_A (country,population) VALUES('美国',100); INSERT INTO table_A (country,population) VALUES('加拿大',100); INSERT INTO table_A (country,population) VALUES('英国',200); INSERT INTO table_A (country,population) VALUES('法国',300); INSERT INTO table_A (country,population) VALUES('日本',250); INSERT INTO table_A (country,population) VALUES('德国',200); INSERT INTO table_A (country,population) VALUES('墨西哥',50); INSERT INTO table_A (country,population) VALUES('印度',250); 使用case when 查询 SELECT CASE country WHEN '中国' THEN '亚洲' WHEN '印度' THEN '亚洲' WHEN '日本' THEN '亚洲' WHEN '美国' THEN '北美洲' WHEN '加拿大' THEN '北美洲' WHEN '墨西哥' THEN '北美洲' ELSE '其他' END AS '洲', SUM(population) AS '人口' FROM table_A GROUP BY CASE country WHEN '中国' THEN '亚洲' WHEN '印度' THEN '亚洲' WHEN '日本' THEN '亚洲' WHEN '美国' THEN '北美洲' WHEN '加拿大' THEN '北美洲' WHEN '墨西哥' THEN '北美洲' ELSE '其他' END;
应该得到下面这个结果:
同样的,我们也可以用这个方法来判断工资的等级,并统计每一等级的人数。SQL代码如下
SELECT CASE WHEN salary <= 500 THEN '1' WHEN salary > 500 AND salary <= 600 THEN '2' WHEN salary > 600 AND salary <= 800 THEN '3' WHEN salary > 800 AND salary <= 1000 THEN '4' ELSE NULL END salary_class, COUNT(*) FROM Table_A GROUP BY CASE WHEN salary <= 500 THEN '1' WHEN salary > 500 AND salary <= 600 THEN '2' WHEN salary > 600 AND salary <= 800 THEN '3' WHEN salary > 800 AND salary <= 1000 THEN '4' ELSE NULL END;
创建表 CREATE TABLE `table_a` ( `id` INT(10) NOT NULL AUTO_INCREMENT, `country` VARCHAR(100) DEFAULT NULL, `population` INT(10) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8; INSERT INTO table_A (country,sex,population) VALUES('中国',1,340); INSERT INTO table_A (country,sex,population) VALUES('中国',2,260); INSERT INTO table_A (country,sex,population) VALUES('美国',1,45); INSERT INTO table_A (country,sex,population) VALUES('美国',2,55); INSERT INTO table_A (country,sex,population) VALUES('加拿大',1,51); INSERT INTO table_A (country,sex,population) VALUES('加拿大',2,49); INSERT INTO table_A (country,sex,population) VALUES('英国',1,40); INSERT INTO table_A (country,sex,population) VALUES('英国',2,60); 使用case when分组查询 SELECT country AS '国家', SUM(CASE WHEN sex=1 THEN population ELSE 0 END) AS '男', SUM(CASE WHEN sex=2 THEN population ELSE 0 END) AS '女' FROM table_A GROUP BY country;
按照国家和性别进行分组,得出结果如下
提醒一下使用Case函数的新手注意不要犯下面的错误
CASE col_1 WHEN 1 THEN 'Right' WHEN NULL THEN 'Wrong' END
在这个语句中When Null这一行总是返回unknown,所以永远不会出现Wrong的情况。因为这句可以替换成WHEN col_1 = NULL,这是一个错误的用法,这个时候我们应该选择用WHEN col_1 IS NULL。
3 . 根据条件有选择的UPDATE
例 : 有如下更新条件
1> . 工资5000以上的职工 , 工资减少10%
2> . 工资在2000到4600之间的职工 , 工资增加15%
很容易考虑的是选择执行两次UPDATE语句 , 如下所示 :
– 条件1
update salarys set salary=salary*0.9 where salary >= 5000;
– 条件 2
update salarys set salary=salary*1.15 where salary >= 2000 and salary < 4600
但是事情没有想象得那么简单 , 假设有个人工资 5000 块 . 首先按照条件 1 , 工资减少 10 % , 变成工资4500 . 接下来运行第二个sql的时候 , 因为这个人的工资是4500 在2000到4600 的范围内 , 需增加15% , 最后这个人的工资结果是5157 , 不但没减少, 反而增加了 . 如果要是 反过来执行, 那么工资4600的人相反会变成减少工资 . 如果要一个SQL 语句实现这个功能的话 , 我们需要用到Case函数 . 代码如下
update salarys set salary = case when salary >= 5000 then salary*0.9 when salary >= 2000 and salary < 4600 then salary*1.15 else salary end;
这里要注意一点 , 最后一行的 esle salary 是必须的 , 要是没有这行, 不符合这两个条件的人的工资将会被写成NULL . 在case 函数中else部分的默认值为NULL , 这点是需要注意的地方 .
参考:
https://blog.csdn.net/muriyue6/article/details/73442054
https://blog.csdn.net/muriyue6/article/details/73442054
https://www.jianshu.com/p/cbb05073931f
https://www.cnblogs.com/xiaowu/archive/2011/08/17/2143445.html
https://help.aliyun.com/document_detail/62764.html