ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

SQL Server Case when 的使用方法总结

2022-01-06 12:07:08  阅读:217  来源: 互联网

标签:Case salary country when WHEN VALUES SQL table population


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函数的一些示例

  1. 已知数据按照另一种方式进行分组 ,分析
    有如下数据:
    在这里插入图片描述
    根据这个国家人口数据,统计亚洲和北美洲的人口数量。应该得到下面这个结果。
创建表
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;
  1. 用一个SQL语句完成不同条件的分组 .
    数据如下:
    在这里插入图片描述
创建表
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

标签:Case,salary,country,when,WHEN,VALUES,SQL,table,population
来源: https://blog.csdn.net/surenx/article/details/122338670

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有