IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Sql case函数 -> 正文阅读

[大数据]Sql case函数

case函数

case函数分为普通case函数搜索case函数,区别是普通的case函数写法相对简洁,但是功能也相对简单,搜索case函数的功能更加强大。

1. 普通case函数

CASE  <表达式>
   WHEN <1> THEN <操作>
   WHEN <2> THEN <操作>
   ...
   ELSE <操作>
END 

2. 搜索case函数

CASE
    WHEN <条件1> THEN <命令>
    WHEN <条件2> THEN <命令>
    ...
    ELSE commands
END

case函数常用作 行转列(重点)检查表中字段值是否一致结合分组统计数据分条件更新字段值。

一、行转列

1. 建表sql

CREATE TABLE RowtoCol (
	s_name VARCHAR ( 10 ),
	s_course VARCHAR ( 10 ),
	s_score INT 
)

INSERT INTO RowtoCol VALUES ('张三','语文',73);
INSERT INTO RowtoCol VALUES ('张三','数学',86);
INSERT INTO RowtoCol VALUES ('张三','物理',99);
INSERT INTO RowtoCol VALUES ('李四','语文',78);
INSERT INTO RowtoCol VALUES ('李四','数学',98);
INSERT INTO RowtoCol VALUES ('李四','物理',93);

**SELECT * FROM RowtoCol;**
image.png

2. 普通case函数实现行转列

SELECT
	RowtoCol.s_name,
	MAX(CASE s_course WHEN '语文' THEN s_score ELSE 0 END) 语文,
	MAX(CASE s_course WHEN '数学' THEN s_score ELSE 0 END) 数学,
	MAX(CASE s_course WHEN '物理' THEN s_score ELSE 0 END) 物理 
FROM
	RowtoCol 
GROUP BY
	RowtoCol.s_name

image.png

3. 搜索case函数行转列

SELECT
	RowtoCol.s_name,
	MAX(CASE WHEN s_course='语文' THEN s_score ELSE 0 END ) 语文,
	MAX(CASE WHEN s_course='数学' THEN s_score ELSE 0 END ) 数学,
	MAX(CASE WHEN s_course='物理' THEN s_score ELSE 0 END ) 物理
FROM
	RowtoCol 
GROUP BY
	RowtoCol.s_name

image.png

二、检查表中字段值是否一致

1. 建表sql

CREATE TABLE user1 (
	name VARCHAR ( 10 ),
	info VARCHAR ( 20 )
)

INSERT INTO user1 VALUES ('张三','I\'m fan ');
INSERT INTO user1 VALUES ('李四','Thank you');
INSERT INTO user1 VALUES ('王二','And you');

select * from user1;


CREATE TABLE user2 (
	name VARCHAR ( 10 ),
	info VARCHAR ( 20 )
)

INSERT INTO user2 VALUES ('张三','I\'m fan ');
INSERT INTO user2 VALUES ('李四','Thanks');
INSERT INTO user2 VALUES ('王二','And you');

select * from user2;

image.png

2. 搜索case函数
这里只能使用搜索case函数不能使用普通case函数,因为普通case函数when之后只能是等于判断。

SELECT
	info,
	( CASE WHEN user1.info IN ( SELECT info FROM user2 ) THEN '数据一致' ELSE '数据不一致' END ) AS '比较结果'
FROM
	user1

image.png

三、结合分组统计数据

1. 普通case函数

SELECT
	(
	CASE
			city 
			WHEN '北京' THEN '北方' 
			WHEN '哈尔滨' THEN '北方' 
			WHEN '天津' THEN '北方' 
			WHEN '上海' THEN '南方' 
			WHEN '南京' THEN '南方' 
			WHEN '广州' THEN '南方' 
			ELSE '其它' 
		END 
		) AS 区域,
		sum( population ) AS '人口数(百万)'
	FROM
		Country 
	GROUP BY
		(
		CASE
				city 
				WHEN '北京' THEN '北方' 
				WHEN '哈尔滨' THEN '北方' 
				WHEN '天津' THEN '北方' 
				WHEN '上海' THEN '南方' 
				WHEN '南京' THEN '南方' 
				WHEN '广州' THEN'南方' 
				ELSE '其它' 
		END 
	)

image.png

2. 搜索case函数

SELECT
	(
	CASE 
			WHEN city in ('北京', '哈尔滨', '天津') THEN '北方' 
			WHEN city in ('上海', '南京', '广州') THEN '南方' 
			ELSE '其它' 
		END 
		) AS 区域,
		sum( population ) AS '人口数(百万)'
	FROM
		Country 
	GROUP BY
		(
		CASE 
			WHEN city in ('北京', '哈尔滨', '天津') THEN '北方' 
			WHEN city in ('上海', '南京', '广州') THEN '南方' 
			ELSE '其它' 
		END 
	)

image.png

四、分条件更新字段值

需求: 将工资低于4000的员工涨幅工资30%,工资等于高于5000的员工涨幅10%,数据如下:

CREATE TABLE Employee (
	name VARCHAR ( 10 ),
	salary int
)

INSERT INTO Employee VALUES ('张三',6000);
INSERT INTO Employee VALUES ('李四',5000);
INSERT INTO Employee VALUES ('王二',3900);

select * from Employee

image.png
一开始可能会想直接根据salary更新数据

update Employee Set salary = salary * (1 + 0.3) where salary < 4000;
update Employee Set salary = salary * (1 + 0.1) where salary >= 5000;

但是,如果是这样执行的话实际上会存在问题,比如:原来工资在4000的员工,执行完第一条语句后工资会变成5070,此时,再执行第二条更新语句,因为满足工资大于等于5000,则又会去添加多10%的工资。
可以使用搜索case函数解决这种情况

update Employee Set salary =
	(
	CASE
			WHEN salary < 4000 THEN salary * ( 1 + 0.3 )
			WHEN salary >= 5000 THEN salary * ( 1 + 0.1 ) 
			ELSE salary 
		END 
	) 

image.png

五、普通case函数和搜索case函数和区别

普通case函数搜索case函数的区别是普通的case函数写法相对简洁,但是功能也相对简单,搜索case函数的功能更加强大,具体描述如下:
1、简单case函数判断条件只能是等于,而搜索case函数的条件可以是子查询,In,大于、等于等等
2、如果只是使用简单的条件分组,可以选择普通case函数,如果需要判断更多的场景,则选择搜索case更好。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-10-22 21:22:23  更:2022-10-22 21:23:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年4日历 -2025/4/22 15:31:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码