SQL高级知识——CASE

简介: SQL数据库开发

CASE函数的类型

CASE具有两种格式,简单CASE函数和CASE搜索函数。这两种方式,大部分情况下可以实现相同的功能。


简单CASE函数

语法

CASE column

WHEN <condition> THEN value

WHEN <condition> THEN value

......

ELSE value END

示例

CASE sex
     WHEN '1' THEN '男'
     WHEN '2' THEN '女'
ELSE '其他' END


CASE搜索函数

语法

CASE

WHEN <condition> [,<condition>] THEN value

WHEN <condition> [,<condition>] THEN value

......

ELSE value END

示例

CASE WHEN sex = '1' THEN '男'
     WHEN sex = '2' THEN '女'
ELSE '其他' END

简单CASE 函数重在简洁,但是它只适用于这种单字段的单值比较,而CASE 搜索函数的优点在于适用于所有比较(包括多值比较)的情况。

例如

CASE WHEN sex = '1' AND age>18 THEN '成年男性'
     WHEN sex = '2' AND age>18 THEN '成年女性'
ELSE '其他' END

注意:CASE函数只返回第一个符合条件的值,剩下的CASE部分将会被自动忽略。比如说,下面这段SQL,你永远无法得到“第二类”这个结果

CASE WHEN Type IN ('a','b') THEN '第一类'
     WHEN Type IN ('a')     THEN '第二类'
ELSE '其他类' END

CASE行转列

CASE用的比较广泛的功能就是行转列,就是将记录行里的数据按条件转换成具体的列。看如下的一个示例:

IF OBJECT_ID('Score') IS NOT NULL DROP TABLE Score
GO
CREATE TABLE Score(姓名 NVARCHAR(10),课程 NVARCHAR(10),分数 INT)
INSERT INTO Score VALUES (N'张三',N'语文',74)
INSERT INTO Score VALUES (N'张三',N'数学',83)
INSERT INTO Score VALUES (N'张三',N'物理',93)
INSERT INTO Score VALUES (N'李四',N'语文',74)
INSERT INTO Score VALUES (N'李四',N'数学',84)
INSERT INTO Score VALUES (N'李四',N'物理',94)
GO
SELECT * FROM Score
GO


执行完成后的结果如图:

90.jpg

现在我们想实现这样的功能,就是将各学科作为单独的列来显示各个学生各科的成绩。我们可以对课程里的记录做如下的行列转换:

SELECT 姓名,
MAX(CASE 课程 WHEN N'语文' THEN 分数 ELSE 0 END) 语文,
MAX(CASE 课程 WHEN N'数学' THEN 分数 ELSE 0 END) 数学,
MAX(CASE 课程 WHEN N'物理' THEN 分数 ELSE 0 END) 物理
FROM Score
GROUP BY 姓名

执行结果如下:


91.jpg


行转列新方法

这样就很好的完成了行列的转换了,当然这只是一个比较简单的例子,SQL Server 2005版之后有单独的行列转换功能PIOVT,以下查询同样可以得到上面的结果:

SELECT * FROM Score
PIVOT( MAX(分数) FOR 课程 IN (语文,数学,物理)) A

其中FOR后面的是我们即将进行行转列的列部分

IN里面的是我们行转列之后的列

MAX是聚合IN里面的内容,也可以是其他聚合函数:SUM,MIN,COUNT等

PIVOT写法比较固定,是CASE WHEN的一种简略写法。


批注

CASE是我们在日常工作中使用非常频繁的一个功能,可以很好的将我们需要的数据单独的显示在一列里面,有助于对数据有个比较清晰的掌握。与Excel的转置有点类似,但是其功能的多样性又比Excel更强一点。

相关文章
|
7月前
|
SQL
SQL 的 AND、OR 和 NOT 运算符:条件筛选的高级用法
SQL的AND运算符用于根据多个条件筛选记录,确保所有条件都为TRUE才返回记录。下面是AND运算符的基本语法:
153 1
|
7月前
|
SQL Oracle 关系型数据库
SQL 数据操作技巧:SELECT INTO、INSERT INTO SELECT 和 CASE 语
SELECT INTO 语句将数据从一个表复制到一个新表中。
123 1
|
4月前
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之如何在SQL语句里使用CASE WHEN语句
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
123 2
|
3月前
|
SQL
SQL: 巧妙使用CASE WHEN实现查询
文章演示了如何利用SQL中的CASE WHEN语句来有效地进行条件性聚合查询,通过具体示例展示了CASE WHEN在统计分析中的应用技巧。
86 0
|
7月前
|
SQL 存储 数据可视化
10个高级的 SQL 查询技巧
10个高级的 SQL 查询技巧
|
5月前
|
SQL 数据处理 数据库
SQL SELECT语句的高级应用与技巧
SQL SELECT语句的高级应用与技巧
|
6月前
|
SQL 存储 Java
SQL数据库学习指南:从基础到高级
SQL数据库学习指南:从基础到高级
|
6月前
|
SQL 数据库
SQL中CASE WHEN THEN ELSE END的用法详解
SQL中CASE WHEN THEN ELSE END的用法详解
|
7月前
|
SQL Oracle 关系型数据库
整合Mybatis-Plus高级,Oracle 主键Sequence,Sql 注入器实现自定义全局操作
整合Mybatis-Plus高级,Oracle 主键Sequence,Sql 注入器实现自定义全局操作
155 0
|
6月前
|
SQL XML 数据库
后端数据库开发高级之通过在xml文件中映射实现动态SQL
后端数据库开发高级之通过在xml文件中映射实现动态SQL
62 3