CASE WHEN 及 SELECT CASE WHEN的用法

CASE WHEN 及 SELECT CASE WHEN的用法Case 具有两种格式 简单 Case 函数和 Case 搜索函数 简单 Case 函数 CASE nbsp sexWHEN nbsp 1 nbsp THEN nbsp 男 WHEN nbsp 2 nbsp THEN nbsp 女 ELSE nbsp 其他 nbsp END nbsp Case 搜索函数 nbsp CASE nbsp WHENsex nbsp 1 nbsp THEN nbsp 男 nbsp WHENsex nbsp 2 nbsp THEN nbsp 女 nbsp ELSE nbsp 其他 nbsp END nbsp nbsp nbsp nbsp nbsp 种方式

Case具有两种格式。简单Case函数和Case搜索函数。

简单Case函数

CASE sex

WHEN ‘1’ THEN ‘男’

WHEN ‘2’ THEN ‘女’

ELSE ‘其他’ END

 

–Case搜索函数 

CASE WHEN sex = ‘1’ THEN ‘男’ 

WHEN sex = ‘2’ THEN ‘女’ 

–比如说,下面这段SQL,你永远无法得到“第二类”这个结果 

CASE WHEN col_1 IN ( ‘a’, ‘b’) THEN ‘第一类’ 

WHEN col_1 IN (‘a’)  THEN ‘第二类’ 

ELSE’其他’ END

如果单纯使用Check: CONSTRAINT check_salary CHECK ( sex = '2' AND salary > 1000 ) 女职员的条件倒是符合了,男职员就无法输入了。 

四,根据条件有选择的UPDATE。

例,有如下更新条件




1.工资5000以上的职员,工资减少10%

2.工资在2000到4600之间的职员,工资增加15%

很容易考虑的是选择执行两次UPDATE语句,如下所示

–条件1 

UPDATE Personnel  SET salary = salary * 0.9  WHERE salary >= 5000; 

–条件2 

UPDATE Personnel  SET salary = salary * 1.15 

WHERE salary >= 2000 AND salary < 4600;

UPDATE Personnel

SET salary =

CASE WHEN salary >= 5000                   THEN salary * 0.9 

     WHEN salary >= 2000 AND salary < 4600  THEN salary * 1.15 

ELSE salary END; 

p_key col_1 col_2
a 1 张三
b 2 李四
c 3 王五

假设有如上数据,需要把主键ab相互交换。用Case函数来实现的话,代码如下

UPDATE SomeTable 

SET p_key = CASE WHEN p_key = ‘a’  THEN ‘b’ 

WHEN p_key = ‘b’  THEN ‘a’  ELSE p_key END 

WHERE p_key IN (‘a’, ‘b’); 

–使用IN的时候 

SELECT keyCol, 

CASE WHEN keyCol IN ( SELECT keyCol FROM tbl_B )  THEN ‘Matched’ 

ELSE ‘Unmatched’ END Label 

FROM tbl_A; 

 

–使用EXISTS的时候 

SELECT keyCol, 

CASE WHEN EXISTS ( SELECT * FROM tbl_B  WHERE tbl_A.keyCol = tbl_B.keyCol )  THEN ‘Matched’  ELSE ‘Unmatched’END Label 

FROM tbl_A; 

学号(std_id) 课程ID(class_id) 课程名(class_name) 主修flag(main_class_flg)
100 1 经济学 Y
100 2 历史学 N
200 2 历史学 N
200 3 考古学 Y
200 4 计算机 N
300 4 计算机 N
400 5 化学 N
500 6 数学 N

1.只选修一门课程的人,返回那门课程的ID

2.选修多门课程的人,返回所选的主课程ID

SELECT std_id, MAX(class_id) AS main_class  FROM Studentclass  GROUP BY std_id  HAVING COUNT(*) = 1; 

STD_ID   MAIN_class  

300      4 

400      5 

500      6 

–条件2:选择多门课程的学生  SELECT std_id, class_id AS main_class  FROM Studentclass  WHERE main_class_flg = ‘Y’ ; 

STD_ID  MAIN_class   

100     1 

200     3 

SELECT  std_id, 

CASE

WHEN COUNT(*) = 1  –只选择一门课程的学生的情况  THEN MAX(class_id) 

ELSE

MAX(CASE WHEN main_class_flg = ‘Y’  THEN class_id  ELSE NULL END  ) 

END AS main_class 

FROM Studentclass  GROUP BY std_id; 

STD_ID   MAIN_class 

100      1 

200      3 

300      4 

400      5 

500      6 

WHEN  1    THEN ‘Right’ 

WHEN  NULL THEN ‘Wrong’ 

END 

在这个语句中When Null这一行总是返回unknown,所以永远不会出现Wrong的情况。因为这句实际表达的意思是

WHEN col_1 = NULL,这是一个错误的用法,这个时候我们应该选择用WHEN col_1 IS NULL。 

 

七、小结

   select 与 case结合使用最大的好处有两点,一是在显示查询结果时可以灵活的组织格式,二是有效避免了多次对同一个表或几个表的访问。

 

下面举个简单的例子来说明。例如表 students(id, name ,birthday, sex, grade),要求按每个年级统计男生和女生的数量各是多少,统计结果的表头为,年级,男生数量,女生数量。如果不用select case when,为了将男女数量并列显示,统计起来非常麻烦,先确定年级信息,再根据年级取男生数和女生数,而且很容易出错。

GROUP BY grade;

参考:https://www.cnblogs.com/aipan/p/7770611.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/211730.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午9:44
下一篇 2026年3月18日 下午9:44


相关推荐

  • 《PyCharm2019安装教程》

    《PyCharm2019安装教程》目录下载 PyCharm 安装 PyCharm 安装 python 配置 PyCharm 环境简单使用 PyCharmPyCha 设置中文 PyCharm 安装第三方库下载 PyCharmPyCha 官网下载 https www jetbrains com pycharm download section windows 安装 PyCharm

    2026年3月27日
    1
  • CSS3 opacity属性

    CSS3 opacity属性CSS3opacity属性记录设置一个div元素的透明度级别实现原理:opacity属性在实现的原理上极度类似于PS中的蒙版概念样式:div{opacity:0.5;}取值范围:0~1注意:IE8和早期版本支持另一种过滤器属性。像:filter:Alpha(opacity=50)属性说明默认值:1继承性:no(不继承)版本:CSS3属性:object.style.opacity问题1.如果父元素设置opacity属性,那么这个的所有子元素都

    2022年5月26日
    39
  • 2021年爬虫人员必须掌握的 App 抓包工具(一):Charles

    2021年爬虫人员必须掌握的 App 抓包工具(一):Charles目录一、Charles工具的下载与安装二、SSL证书的安装2.1安装PC端证书2.2设置代理2.3配置网络2.4安装手机端证书三、总结爬虫不仅仅只对Web页面的信息进行爬取,还可以爬取应用中存在的大量数据,例如移动端的App。由于App中的数据都是通过异步的方式从后台服务器中获取的,类似于Web中的Ajax请求,所以在爬取数据前同样需要分析App用于获取数据的URL。由于App运行在手机或平板电脑中,在获取请求地址时无法像Web一样在PC端通过浏览器进

    2022年5月29日
    54
  • google的ipv6地址_Google礼品卡

    google的ipv6地址_Google礼品卡#GooglePlus2a00:1450:8007::64plus.google.com2404:6800:8005::62talkgadget.google.com##Google.comGoogle.com2404:6800:8005::68www.google.com#主页2404:6800:8005::c1m.google.com#Google移动版2404:6…

    2022年10月9日
    7
  • 人口出生率公式_三阶差商公式

    人口出生率公式_三阶差商公式本博文源于matlab。旨在对出生人口增长率进行计算。

    2025年9月14日
    9
  • 《剑指offer》– 回溯法:矩阵中的路径、机器人的运动范围

    《剑指offer》– 回溯法:矩阵中的路径、机器人的运动范围

    2021年10月3日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号