SQL中case when用法详解及使用案例

这篇具有很好参考价值的文章主要介绍了SQL中case when用法详解及使用案例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、语法

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

简单Case函数格式:

CASE 列名
WHEN 条件值1 THEN 选项1
WHEN 条件值2 THEN 选项2
……
ELSE 默认值
END

Case搜索函数:

CASE
WHEN 条件1 THEN 选项1
WHEN 条件2 THEN 选项2
……
ELSE 默认值
END

二、case when应用场景

case when与子查询性能比较及优化。
为了方便说明,我们先创建表,并造点数据。

CREATE TABLE `table_a` (
	`id` INT NOT NULL AUTO_INCREMENT,
	`country` VARCHAR(50) NOT NULL,
	`sex` CHAR(2) not null,
	`population` int NOT NULL,
	PRIMARY KEY (`id`)
)
;

insert into table_a values(null,"中国","男",10);
insert into table_a values(null,"中国","女",5);
insert into table_a values(null,"美国","男",2);
insert into table_a values(null,"美国","女",4);
insert into table_a values(null,"加拿大","男",4);
insert into table_a values(null,"加拿大","女",4);
insert into table_a values(null,"英国","男",6);
insert into table_a values(null,"英国","女",6);
insert into table_a values(null,"法国","男",2);
insert into table_a values(null,"法国","女",2);
insert into table_a values(null,"日本","男",7);
insert into table_a values(null,"日本","女",7);
insert into table_a values(null,"德国","男",2);
insert into table_a values(null,"墨西哥","男",7);
insert into table_a values(null,"印度","男",1);

2.1 案例一

统计亚洲和北美洲的人口数量,要求结果如下:
case when 效率,笔记,sql,数据库,servlet

若第一时间没有想到case when,我们可能会写出下面的sql:

SELECT sum(population) from Table_A where country in ('中国','印度','日本')
UNION
SELECT sum(population) from Table_A where country in ('美国','加拿大','墨西哥')
UNION
SELECT sum(population) from Table_A where country not in ('中国','印度','日本','美国','加拿大','墨西哥');

运行结果:
case when 效率,笔记,sql,数据库,servlet

这个sql的性能效率比较低,对同一个数据表查询了三次,也无法获得州的那一列。

使用case when进行改造,如下:

SELECT SUM(population)
FROM Table_A 
GROUP BY
CASE country 
	WHEN '中国' THEN '亚洲' 
	WHEN '印度' THEN '亚洲'
	WHEN '日本' THEN '亚洲' 
	WHEN '美国' THEN '北美洲' 
	WHEN '加拿大'  THEN '北美洲' 
	WHEN '墨西哥'  THEN '北美洲' 
ELSE '其他' END; 

运行结果:
case when 效率,笔记,sql,数据库,servlet
使用了case when的sql语句明显效率高一些,因为它仅查找了一次表而已,若想获得州的那一列,只需改写如下:

SELECT  SUM(population), 
(CASE country  WHEN '中国' THEN '亚洲' 
  WHEN '印度' THEN '亚洲' 
  WHEN '日本' THEN '亚洲' 
  WHEN '美国' THEN '北美洲' 
  WHEN '加拿大'  THEN '北美洲' 
  WHEN '墨西哥'  THEN '北美洲' 
ELSE '其他' END ) asFROM    Table_A 
GROUP BY
CASE country 
	WHEN '中国' THEN '亚洲' 
	WHEN '印度' THEN '亚洲'
	WHEN '日本' THEN '亚洲' 
	WHEN '美国' THEN '北美洲' 
	WHEN '加拿大'  THEN '北美洲' 
	WHEN '墨西哥'  THEN '北美洲' 
ELSE '其他' END; 

运行结果:
case when 效率,笔记,sql,数据库,servlet

2.2 案例二

统计每个国家的男生人数和女生人数,要求结果如下:
case when 效率,笔记,sql,数据库,servlet
同样的,不使用case when的写法如下:

SELECT
	a.country,
	(
	SELECT
		SUM( a1.population ) 
	FROM
		table_a a1 
	WHERE
		a1.country = a.country 
		AND a1.sex = '男' 
		),
	(
	SELECT
		SUM( a1.population ) 
	FROM
		table_a a1 
	WHERE
		a1.country = a.country 
		AND a1.sex = '女' 
		)FROM
	table_a a 
GROUP BY
	a.country;

执行结果:
case when 效率,笔记,sql,数据库,servlet
使用case when进行优化:

SELECT COUNTRY,
SUM(CASE SEX WHEN '男' THEN population ELSE 0 END) AS '男',
SUM(CASE SEX WHEN '女' THEN population ELSE 0 END) AS '女'
FROM table_a GROUP BY COUNTRY;

执行结果:
case when 效率,笔记,sql,数据库,servlet
两者对比,显然的case when的效率既简洁,效率也高。

2.3 案例三

上述两个案例也许不够贴近日常的工作内容,下面举个现实工作遇到的案例。

建表sql如下:

-- 货架表
CREATE TABLE `shelves` (
	`shelves_id` INT NOT NULL AUTO_INCREMENT, -- 货架id
	`shelves_num` VARCHAR(50) NOT NULL UNIQUE,	-- 货架号
	`shelves_area` VARCHAR(50) NOT NULL,	--货架区域
	PRIMARY KEY (`shelves_id`)
)
;

-- 物品表
CREATE TABLE `goods` (
	`goods_id` INT NOT NULL AUTO_INCREMENT, -- 物品id
	`goods_name` VARCHAR(50) NOT NULL UNIQUE,	-- 物品名称
	`goods_type` VARCHAR(20) NOT NULL,	-- 物品类型
	`goods_quantity` int NOT NULL,	-- 物品数量
	`goods_createTime` DATETIME NULL DEFAULT NULL,	-- 创建时间
	`goods_expiryTime` DATETIME NULL DEFAULT NULL,	-- 过期时间
	`goods_shelvesId` INT NULL DEFAULT NULL,	-- 货架id
	PRIMARY KEY (`goods_id`)
)
;

需求说明:统计每个货架上的物品数量,要求统计结果如下
case when 效率,笔记,sql,数据库,servlet
使用子查询的写法:

SELECT
	shelves_area shelvesArea,
	shelves_num shelvesNum,
	COUNT( DISTINCT goods_type ) goodsTypeSum,
	COUNT( goods_id ) goodsSum,
	(
	SELECT
		COUNT(*)
	FROM
		goods
	WHERE
		goods_expiryTime < NOW()
	AND goods_shelvesId = shelves_id ) isNotExpiry,
	(
	SELECT
		COUNT(*)
	FROM
		goods
	WHERE
		goods_expiryTime > NOW()
	AND goods_shelvesId = shelves_id) isExpiry
FROM
	shelves
LEFT JOIN goods ON shelves_id = goods_shelvesId
GROUP BY shelves_id;

使用case when的写法:

SELECT
	shelves_area shelvesArea,
	shelves_num shelvesNum,
	COUNT( DISTINCT goods_type ) goodsTypeSum,
	COUNT( goods_id ) goodsSum,
	SUM(CASE WHEN (shelves_id = goods_shelvesId AND goods_expiryTime < NOW()) THEN 1 ELSE 0 END) isNotExpiry,
	SUM(CASE WHEN (shelves_id = goods_shelvesId AND goods_expiryTime > NOW()) THEN 1 ELSE	0 END) isExpiry
FROM
	shelves
LEFT JOIN goods ON shelves_id = goods_shelvesId
GROUP BY shelves_id;

两个不同写法的运行结果是一样的,但是性能效率上case when 显然比子查询的高一些。
运行结果如下(本人未造相关测试数据):
case when 效率,笔记,sql,数据库,servlet

三、扩展

3.1 根据条件有选择的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;

但是事情没有想象得那么简单,假设有个人工资5000块。首先,按照条件1,工资减少10%,变成工资4500。接下来运行第二个SQL时候,因为这个人的工资是4500在2000到4600的范围之内,需增加15%,最后这个人的工资结果是5175,不但没有减少,反而增加了。如果要是反过来执行,那么工资4600的人相反会变成减少工资。暂且不管这个规章是多么荒诞,如果想要一个SQL 语句实现这个功能的话,我们需要用到Case函数。代码如下:

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;

这里要注意一点,最后一行的ELSE salary是必需的,要是没有这行,不符合这两个条件的人的工资将会被写成NUll,那可就大事不妙了。在Case函数中Else部分的默认值是NULL,这点是需要注意的地方。

这种方法还可以在很多地方使用,比如说变更主键这种累活。
一般情况下,要想把两条数据的Primary key,a和b交换,需要经过临时存储,拷贝,读回数据的三个过程,要是使用Case函数的话,一切都变得简单多了。
p_key col_1 col_2
a 1 张三
b 2 李四
c 3 王五
假设有如上数据,需要把主键a和b相互交换。用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');

四、参考来源

https://blog.csdn.net/Max_Rzdq/article/details/79418893?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control文章来源地址https://www.toymoban.com/news/detail-615672.html

到了这里,关于SQL中case when用法详解及使用案例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • sql示例:case when作为where 条件

    CASE WHEN语句的结果可以作为WHERE条件和其他条件一起使用,可以根据具体的需求来灵活组合。下面分别给出多个CASE WHEN语句在不同位置的SQL示例: CASE WHEN语句在WHERE条件中作为条件之一 上述代码中,CASE WHEN语句在WHERE条件中作为一个条件,其中condition_1和condition_2表示需要满足

    2024年02月16日
    浏览(76)
  • SQL中的CASE WHEN语句:从基础到高级应用指南

    我们使用一个名为\\\"Products\\\"的表,包含以下列:ProductID、ProductName、CategoryID、UnitPrice、StockQuantity。 示例展示 productID productName categoryID unitPrice stockQuantity 1 Laptop 1 800 50 2 Smartphone 1 500 100 3 T-shirt 2 20 200 4 Jeans 2 40 150 5 Headphones 1 100 75 1. CASE WHEN-基本使用 查询结果: ProductName UnitPric

    2024年02月09日
    浏览(73)
  • SQL中的UNION和UNION ALL的区别及用法详解、“提高SQL查询效率:UNION和UNION ALL的比较、使用实例详解SQL中的UNION和UNION ALL操作符

    UNION 和 UNION ALL 都是 SQL 中用于将多个 SELECT 语句的结果合并成一个结果集的操作符。它们都适用于需要将多个表或查询结果合并在一起的情况。但是它们的行为略有不同。 UNION 和 UNION ALL 的区别在于, UNION 会将结果集合并成一个不含重复行的结果集,而 UNION ALL 则会保留所有

    2024年02月03日
    浏览(64)
  • SQL的CASE WHEN函数、CAST函数、CONVERT() 函数、COALESCE()函数、DATEDIFF()函数

    一、CASE WHEN简单使用 二、CASE WHEN语句与聚合函数一起使用 三、CAST函数 用于将某种数据类型的表达式显式转换为另一种数据类型。CAST()函数的参数是一个表达式,它包括用AS分隔的源值和目标数据类型。 可以转换的类型是有限制的。这个类型可以是以下值其中的一个:

    2024年02月07日
    浏览(64)
  • CASE WHEN函数语句多条件下使用详解

    目录 CASE 的两种格式: 简单CASE函数 和 CASE搜索函数 同时配合 SUM 以及 COUNT 方法的使用 ① SUM函数 ② COUNT函数 CASE WHEN函数语句,实现简单CASE函数和CASE搜索函数两种格式。 同时配合 SUM以及COUNT方法的使用 CASE 的两种格式:  简单CASE函数 和 CASE搜索函数 两种格式示例: 状态

    2024年02月11日
    浏览(72)
  • MySql中case when的用法

    case when介绍: case when语句,用于计算条件列表并返回多个可能结果表达式之一。 CASE 具有两种格式:简单 CASE 函数将某个表达式与一组简单表达式进行比较以确定结果。 CASE 搜索函数计算一组布尔表达式以确定结果。 两种格式都支持可选的 ELSE 参数。 这是代码格式: CASE    

    2024年02月16日
    浏览(52)
  • PostgreSQL中case when与position包含用法

    对于复杂的业务场景,代码与SQL都可以去实现一个场景。如果用代码去实现看起来代码会冗余,不高效,不如sql的效率与简洁。 pgsql与mysql中case when用法几乎一致。在SQL中,“Case When”语句用于选择判断,在执行时先对条件进行判断,然后根据判断结果做出相应的操作;语法

    2024年02月05日
    浏览(65)
  • case when then else end语句的用法

    case具有两种格式。简单case函数和case搜索函数。 --简单case函数             case sex             when \\\'1\\\' then \\\'男\\\'             when \\\'2\\\' then \\\'女\\\'             else \\\'其他\\\' end  --case搜索函数--经常用的是这个             case when sex = \\\'1\\\' then \\\'男\\\'  

    2024年02月10日
    浏览(69)
  • 选读SQL经典实例笔记13_case与聚合

    6.4.2.1. Oracle的窗口函数支持DATE类型排序

    2024年02月15日
    浏览(178)
  • 12. Oracle中case when详解

    格式:         case expression         when condition_01 then result_01         when condition_02 then result_02         ......         when condition_n then result_n         else result_default         end 表达式expression符合条件condition_01,则返回结果result_01,若该条件不满足,则继续往下判断;以

    2024年02月11日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包