使用CASE表达式使SQL语句的条件判断形式变得十分丰富,也因为CASE表达式不依赖于具体的数据库技术,所以它的可移植性也会更高。

现在就让我们一起来领略一下CASE语句的用法吧。

CASE表达式语法

我们先创建一个Table用来举例(本文全部代码在MySQL 8.0.17和 PostgreSQL 12.2中测试通过) :

CREATE TABLE Goods
(goods_id       CHAR(4)         NOT NULL    ,
goods_name      VARCHAR(100)    NOT NULL    ,
goods_items     VARCHAR(32)     NOT NULL    ,
selling_price   INTEGER                     ,
cost_price      INTEGER                     ,
decision_date   DATE                        ,
PRIMARY KEY (goods_id));-- MySQL中请写成START TRANSACTION;
BEGIN TRANSACTION;  INSERT INTO Goods VALUES ('0001','T恤衫','衣服',1000,500,'2009-09-20');
INSERT INTO Goods VALUES ('0002','打孔器','办公用品',500,320,'2009-09-11');
INSERT INTO Goods VALUES ('0003','运动T恤','衣服',4000,2800,NULL);
INSERT INTO Goods VALUES ('0004','菜刀','厨房用具',3000,2800,'2009-09-20');
INSERT INTO Goods VALUES ('0005','高压锅','厨房用具',6800,5000,'2009-01-15');
INSERT INTO Goods VALUES ('0006','叉子','厨房用具',500,NULL,'2009-09-20');
INSERT INTO Goods VALUES ('0007','擦菜板','厨房用具',880,790,'2008-04-28');
INSERT INTO Goods VALUES ('0008','圆珠笔','办公用品',100,NULL,'2009-11-11');COMMIT;

数据库里的表长这样:

现在表建好了,我们开始吧!

两种表达式

CASE表达式的语法分为简单和复杂两种,其中复杂语法又称“搜索CASE表达式”,已经完全包含了简单语法,建议直接学习复杂语句语法,简单语法了解一下即可。

简单CASE表达式语法

CASE <表达式>WHEN <表达式> THEN <表达式>WHEN <表达式> THEN <表达式>WHEN <表达式> THEN <表达式>...ELSE <表达式>
END;

举个栗子,如果我们要从Goods表中选取出各个物品,并为这些物品类别重命名,命名为 “字母:品类名称” 的形式,那么可以这样操作:

PostgreSQL代码

SELECT goods_name, CASE goods_itemsWHEN '衣服' THEN 'A:' || goods_itemsWHEN '办公用品' THEN 'B:' || goods_itemsWHEN '厨房用具' THEN 'C:' || goods_itemsELSE NULLEND AS abc_goods_items
FROM Goods;

MySQL代码

SELECT goods_name, CASE goods_itemsWHEN '衣服' THEN CONCAT('A:', goods_items)WHEN '办公用品' THEN CONCAT('B:', goods_items)WHEN '厨房用具' THEN CONCAT('C:', goods_items)ELSE NULLEND AS abc_goods_items
FROM Goods;

可以看出当CASE指定了goods_items列后,只需要在“WHEN”关键字后面写对应的值就行,并且在“THEN”后面指明满足这种条件的情况下,返回什么值。“ELSE NULL” 表明“如果上述情况都不满足,就返回一个NULL”。ELSE语句也可以不写,默认返回一个NULL值,但为了代码的可读性,还是建议写上去。

搜索CASE表达式语法

CASE WHEN <判断表达式> THEN <判断表达式>WHEN <判断表达式> THEN <判断表达式>WHEN <判断表达式> THEN <判断表达式>...ELSE <判断表达式>
END

还是上面那个例子,我们使用搜索CASE表达式语法可以写成以下这种形式:

PostgreSQL代码

SELECT goods_name,CASE WHEN goods_items = '衣服' THEN 'A:' || goods_itemsWHEN goods_items = '办公用品' THEN 'B:' || goods_itemsWHEN goods_items = '厨房用具' THEN 'C:' || goods_itemsELSE NULLEND AS abc_goods_items
FROM Goods;

MySQL代码

SELECT goods_name,CASE WHEN goods_items = '衣服' THEN CONCAT('A:', goods_items)WHEN goods_items = '办公用品' THEN CONCAT('B:', goods_items)WHEN goods_items = '厨房用具' THEN CONCAT('C:', goods_items)ELSE NULLEND AS abc_goods_items
FROM Goods;

两者的区别

简单CASE表达式在只针对一列操作的时候,简单易写,代码量较少,像上述代码中展示的一样,简单CASE表达式在写了一次列名“goods_items”后,在WHEN后面就不需要再写了。然而,在实际业务场景下,经常需要针对多列多条件判断,这时候简单CASE表达式就无能为力了,譬如:

SELECT goods_name,selling_price,CASE WHEN selling_price - cost_price > 0  THEN 'Profitable'WHEN selling_price - cost_price < 0  THEN 'Defective'WHEN selling_price - cost_price = 0  THEN 'Fair'ELSE NULLEND AS "P&L"
FROM Goods;

可以看出,搜索CASE表达式的语法可读性更强,后期维护也比简单CASE表达式来得简单。推荐大家使用搜索CASE表达式。

CASE表达式的奇技淫巧

行列互换

使用CASE表达式可以实现行列互换,举个栗子,我们创建一个这样的表格:

MySQL代码:

CREATE TABLE IF NOT EXISTS sales
(`年`        INTEGER     NOT NULL,
`季度`    INTEGER     NOT NULL,
`销售量`   INTEGER);
START TRANSACTION;INSERT INTO sales VALUES ( 1991, 1, 11),(1991, 2, 12),(1991, 3, 13),(1991, 4, 14),(1992, 1, 21),(1992, 2, 22),(1992, 3, 23),(1992, 4, 24);COMMIT;

PostgreSQL代码:

CREATE TABLE IF NOT EXISTS sales
("年"       INTEGER     NOT NULL,
"季度"      INTEGER   NOT NULL,
"销售量"     INTEGER);BEGIN TRANSACTION;INSERT INTO sales VALUES ( 1991, 1, 11),(1991, 2, 12),(1991, 3, 13),(1991, 4, 14),(1992, 1, 21),(1992, 2, 22),(1992, 3, 23),(1992, 4, 24);COMMIT;

表格长这样:

现在,我们需要把表格变成这样:

需要怎么做呢?

很简单,我们可以借助CASE表达式。

MySQL代码:

SELECT `年`,  SUM(CASE WHEN `季度` = 1 THEN `销售量` ELSE 0 END) AS `一季度`, SUM(CASE WHEN `季度` = 2 THEN `销售量` ELSE 0 END) AS `二季度`, SUM(CASE WHEN `季度` = 3 THEN `销售量` ELSE 0 END) AS `三季度`, SUM(CASE WHEN `季度` = 4 THEN `销售量` ELSE 0 END) AS `四季度`
FROM sales GROUP BY `年`;

PostgreSQL代码:

SELECT "年",  SUM(CASE WHEN "季度" = 1 THEN "销售量" ELSE 0 END) AS "一季度", SUM(CASE WHEN "季度" = 2 THEN "销售量" ELSE 0 END) AS "二季度", SUM(CASE WHEN "季度" = 3 THEN "销售量" ELSE 0 END) AS "三季度", SUM(CASE WHEN "季度" = 4 THEN "销售量" ELSE 0 END) AS "四季度"
FROM sales GROUP BY "年";

将已有方式换成新的方式统计

如想将以下表格统计方式更换:

CREATE TABLE IF NOT EXISTS Pop
(country_name VARCHAR(20)     NOT NULL,
population        INTEGER         NOT NULL);-- PostgreSQL 请将以下半角双引号换成半角单引号INSERT INTO Pop VALUES ("中国", 1400050000),                        ("印度", 1369640000),                          ("巴西", 211330000),                          ("尼日利亚", 206510000),                          ("英国", 66690000),                          ("美国", 329460000);

表格长这样:

现在我们想按洲来统计人数,结果如下:

可以这样做:

SELECT CASE country_name WHEN '中国' THEN '亚洲'WHEN '印度' THEN '亚洲'WHEN '巴西' THEN '南美洲'WHEN '尼日利亚' THEN '非洲'WHEN '英国' THEN '欧洲'WHEN '美国' THEN '北美洲' ELSE NULL END AS name_of_continent ,SUM(population) as population
FROM Pop
GROUP BY CASE country_name WHEN '中国' THEN '亚洲'WHEN '印度' THEN '亚洲'WHEN '巴西' THEN '南美洲'WHEN '尼日利亚' THEN '非洲'WHEN '英国' THEN '欧洲'WHEN '美国' THEN '北美洲' ELSE NULL END ;

这里需要注意的是,GROUP BY后面要接上SELECT 子句中的CASE条件。如果对转换前的country_name进行GROUP BY 就会出现统计错误(而不是语法错误,容易被忽视)。

CASE表达式注意事项

注意1:要确保各个分支的返回值类型一致
注意2:不要忘了在结束处写上END
注意3:建议每条CASE语句后面都加上ELSE
注意4:WHEN...THEN...后面不需要加逗号

case when then else多个条件_SQL巡礼之CASE用法相关推荐

  1. update case when 多字段,多条件, mysql中case when用法

    文章目录 前言 sql示例 普通写法: update case when写法 update case when 多字段写法 case when语法 case when 的坑 1.不符合case whe ...

  2. SQL中条件和比较关键字Case的使用方法(case的结果就是得到了一个值)

    Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASEsexWHEN'1'THEN'男' WHEN'2'THEN'女' ELSE'其他'END --Case搜索函数 ...

  3. sql case when then else多个条件_SQL-多表查询

    一.表的加法 union:将多个表的数据记录按行合并在一起(即多个表的并集),同时返回的结果会删除重复行,重复的记录只保留一行.如果需要保留重复行,可以使用union all 二.表的联结 1.交叉联 ...

  4. php case 多个条件判断语句,Shell case语句(多分支条件判断)

    case 语句和 if-elif-else 语句一样都是多分支条件语句,不过和多分支 if 条件语句不同的是,case 语句只能判断一种条件关系,而 if 语句可以判断多种条件关系. case 语句的 ...

  5. SQL中的条件判断语句(case when zhen)用法

    简介: case具有两种格式.简单case函数和case搜索函数.这两种方式,可以实现相同的功能.简单case函数的写法相对比较简洁,但是和case搜索函数相比,功能方面会有些限制,比如写判定式.还有 ...

  6. mysql 查询后根据值的不同进行判断与修改,SQL中的条件判断语句(case when zhen)用法

    需求: mysql 查询后根据值的不同进行判断与修改 语法结构: SQL中的条件判断语句(case when zhen)用法 SELECT A.品号,属性,        CASE           ...

  7. shell基础--条件判断if和case

    目录 一.条件判断 1.按照文件类型进行判断 2.按照文件权限进行判断 3.两个文件之间进行比较 4.两个整数之间比较 5.字符串的判断 6.多重条件判断 二.if条件判断 1.单分支if条件语句 2 ...

  8. 遨博机器人执行线程_遨博机器人报错代码:If命令 if…else和条件选择命令Switch...Case...Default...

    11.6.4 If命令 if-else If-else 是选择判断命令,通过判断条件运行不同的程序分支. ➢  点击昵称右侧空白口会弹出输入框,可修改命令名称. ➢  点击 If 条件下空白窗口会弹出 ...

  9. mysql case when 优化_SQL 逻辑优化 case when 转为 union all

    通常数据库的优化从硬件层面去考虑可分为4个方面: CPU:即降低计算复杂度,如减少sql各类聚合函数,窗口函数,case when等. IO :(较少查询结果集过程中对数据的访问量.数据优化很大程度从 ...

最新文章

  1. iOS JSON解析 NSJSONReadingMutableContainers的作用:
  2. C/C++使用keybd_event模拟键盘按键
  3. pyhton/Perl设置 sublime text2
  4. 数据是互联网下半场产品人突围之道
  5. Shell脚本编程01:基础知识
  6. Android事件处理--读书笔记
  7. 让人迷茫的三十岁,从专业技能、行业知识和软实力的人才三角谈起
  8. leetcode -39组合总数
  9. 添加几个手机联系人_One UI 3.0: 更细腻、更好用,这才是手机系统该有的样子
  10. python网络爬虫系列(十一)——JS的解析
  11. UIView设置背景渐变色
  12. 【网络基础】《TCP/IP详解》学习笔记4
  13. 转:Loadrunner打开https报错“Internet…
  14. bash 字符串处理(转)
  15. java中转为整形的编码_java中Unicode编码转化为中文
  16. Aspose.Words.dll根据模板生成word详解
  17. C语言求 阶乘 5!
  18. OPENCV LOMO效果
  19. 初学者Arcgis教程大全
  20. linux装pl2303驱动下载,Linux下安装USB转串口驱动(PL2303)

热门文章

  1. 面试官问:硬盘里的苍老师每天以TB级别数据增长,你咋处理?我懵了。。。...
  2. CVPR2020 Oral | 港中文-商汤等开源:自监督场景去遮挡
  3. Linux之文本搜索命令 grep
  4. pycharm中的terminal解释器和project 解释器不统一问题
  5. 故对于回调函数来说,在其内部使用 this 是不把稳的做法,解决方案可以在其调用时使用 call / apply / bind 显示绑定。
  6. 一文了解可视化的主成分分析(附教程)
  7. 第一篇:BPE算法(附加)
  8. Myeclipse优化配置
  9. 【T07】不要低估tcp的性能
  10. 学习笔记第三十四节课