1.CASE 具有两种格式,简单 CASE 函数和 CASE 搜索函数。
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
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 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
4.CASE 行转列
CASE 用的比较广泛的功能就是行转列,就是将记录行里的数据按条件转换成具体
的列。 看如下的一个示例:
现在我们想实现这样的功能,就是将各学科作为单独的列来显示各个学生各科的成
绩。我们可以对课程里的记录做如下的行列转换:
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 姓名
执行结果如下:
5. 行转列新方法
这样就很好的完成了行列的转换了,当然这只是一个比较简单的例子,SQL Server 2005 版
之后有单独的行列转换功能 PIOVT,以下查询同样可以得到上面的结果:
SELECT * FROM Score
PIVOT( MAX(分数) FOR 课程 IN (语文,数学,物理)) A
其中 FOR 后面的是我们即将进行行转列的列部分
IN 里面的是我们行转列之后的列
MAX 是聚合 IN 里面的内容,也可以是其他聚合函数:SUM,MIN,COUNT 等
PIVOT 写法比较固定,是 CASE WHEN 的一种简略写法。