关键字: CASE, WHEN, THEN, ELSE, END
重点:CASE表达式
SQL的CASE表达式,在SELECT语句中针对单个的表达式应用IF-THEN-ELSE类型的逻辑。
1. IF-THEN-ELSE逻辑
IF some condition is true
THEN do this
ELSE do that
CASE表达式能够出现在SELECT语句很多地方,先看紧跟在SELECT之后的Columnlist的这种情况。
SELECT
column1,
column2,
CaseExpression
FROM table
CASE表达式有两种一般格式:简单格式和查询格式
2. 简单格式
SELECT
CASE CaseExpression
WHEN Value1 THEN result1
WHEN Value1 THEN result1
(Repeat WHEN-THEN any number of times)
[ELSE DefaultResult]
END
[]代表可选,说明ELSE也不是必须的。但是每个CASE表达式中包含关键字ELSE已明确声明一个默认值是一个好的习惯。
示例:
ProductID CategoryCode ProductDescription
------------------------------------------------------------------------------
1 F Apple
2 F Orange
3 S Mustand
4 V Corrot
SELECT
CASE CategoryCode
WHEN ‘F’ THEN ‘Fruit’
WHEN ‘V’ THEN ‘Vegetable’
ElSE ‘Other’
END As ‘Category’,
ProductDescription AS ‘Description’
FROM Products
CASE关键字作用在CategoryID列上:如果该列是’F’则显示’Fruit’...ELSE行提供了一个默认值。END结束了CASE语句,并且还包含了一个关键字AS为这个CASE表达式的结果提供了一个列的别名,意思就是这一结果列的值是默认值。
结果:
Category Description
---------------------------
Fruit Apple
Fruit Orange
Other Mustand
Vegetable Corrot
可见,CASE表达式对于把不好理解的值转换成有意义的描述是很有用的。
3. 查询格式
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
(Repeat WHEN-THEN any number of times)
[ELSE DefaultResult]
END
以本例写出等价的查询格式的表达式:
SELECT
CASE
WHEN CategoryCode ‘F’ THEN ‘Fruit’
WHEN CategoryCode ‘V’ THEN ‘Vegetable’
ElSE ‘Other’
END As ‘Category’,
ProductDescription AS ‘Description’
FROM Products
对比简单格式,简单格式是把待计算的量放在了CASE关键字之后,WHEN后边的表达式是一个简单的直接量(逻辑就是如果CASE后面的计算量等于WHEN后面的直接量,那么CASE后面的计算量=THEN后面的直接量)。查询格式中待计算的量并不是放在关键字CASE后面的,这种格式允许在WHEN后面放置较为复杂的条件表达式。
如果是这样的表
ProductID Fruit Vegetable Spice ProductDescription
------------------------------------------------------------------------------
1 X Apple
2 X Orange
3 X Mustand
4 X Carrot
SELECT
CASE
WHEN Fruit ‘X’ THEN ‘Fruit’
WHEN Vegetable ‘X’ THEN ‘Vegetable’
ELSE ‘Other’
END AS ‘Category’,
ProductDescription AS ‘Description’
FROM Products
结果:
Category Description
-------------------------------
Fruit Apple
Fruit Orange
Other Mustand
Vegetable Corrot
PS:因为原来的表使用了三个列来表示产品是水果、蔬菜还是香料,那么需要查询格式的CASE子句,以实现逻辑。简单格式只是对单个的列进行分析。