33 CASE WHEN的用法
33.1 CASE函数的类型
CASE函数具有两种格式,简单的CASE函数和CASE搜索函数。这两种方式,大部分情况下可以实现相同的功能。
33.2 简单CASE函数
语法:
CASE column WHEN <condition> THEN value WHEN <condition> THEN value ...... ELSE value END;
示例:
CASE sex WHEN '1' THEN '男' WHEN ‘2’ THEN '女' ELSE '其他' END;
33.3 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 WNEH 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;
33.4 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
执行完后结果如图所示:

现在我们想实现这样的功能,就是将各学科作为单独的列来显示各个学生各科的成绩。我们可以对课程里的记录做如下的行列转换:
SELECT 姓名, MAX(CASE 课程 WHEN N'语文' THEN 分数 ELSE 0 END) AS 语文, MAX(CASE 课程 WHEN N'数学' THEN 分数 ELSE 0 END) AS 数学, MAX(CASE 课程 WHEN N'物理' THEN 分数 ELSE 0 END) AS 物理 FROM Score GROUP BY 姓名;
执行结果如下:

33.5 行转列新方法
SQL Server 2005版之后有单独的行列转换功能PIVOT,以下查询同样可以得到上面的结果:
SELECT * FROM Score PIVOT (MAX(分数) FOR 课程 IN (语文,数学,物理)) A
其中FOR后面的是我们即将进行行转列的列部分,IN里面的是我们行转列之后的列,MAX是聚合IN里面的内容,也可以是其他聚合函数:SUM、MIN、COUNT等。PIVOT写法比较固定,是CASE WHEN的一种简略写法。
33.6 批注
CASE是在日常工作中使用非常频繁的一个功能,可以很好的将我们需要的数据单独的显示在一列里面,有助于对数据有个比较清晰的掌握。

浙公网安备 33010602011771号