SQL Server CASE 表达式
在 SQL Server 中,CASE
表达式可以根据一定的条件进行分支判断,并返回对应的结果。它类似于编程语言中的 if-else
语句,可以用于查询、更新等操作。
语法
CASE
表达式的基本语法如下:
CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE else_result
END
其中,expression
是要进行判断的表达式,可以是一个列名、一个变量或者一个常量;value1, value2, ...
是要进行匹配的值;result1, result2, ...
是匹配值对应的结果;else_result
是当所有匹配值都不满足时的默认结果。每一个 WHEN
子句必须跟一个对应的 THEN
子句,可以有多个,但只有第一个匹配成功的子句的结果会被返回。
除了基本语法外,CASE
表达式还可以使用搜索语法。搜索语法的语法如下:
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE else_result
END
其中,condition1, condition2, ...
是要进行判断的条件表达式,可以是任何一个逻辑表达式,包括大于、小于、等于等操作符。
使用场景
CASE
表达式在 SQL 查询中广泛使用,可以用于以下场景:
- 根据不同的条件返回不同的结果
- 对查询结果进行分类汇总
- 对查询结果进行转换和处理
示例
下面是两个使用 CASE
表达式的示例。
示例 1:根据不同的条件返回不同的结果
假设我们有一个包含学生成绩的表格,其中包括学生的姓名、科目和分数。我们想要查询每个学生的总分,并在总分大于等于 200 时返回 “通过”,否则返回 “不通过”。可以使用以下 SQL 语句:
SELECT name,
SUM(CASE WHEN subject = 'math' THEN score ELSE 0 END +
CASE WHEN subject = 'english' THEN score ELSE 0 END) AS total_score,
CASE WHEN SUM(CASE WHEN subject = 'math' THEN score ELSE 0 END +
CASE WHEN subject = 'english' THEN score ELSE 0 END) >= 200
THEN 'Yes' ELSE 'No' END AS result
FROM grades
GROUP BY name;
这个查询会返回每个学生的总分和结果。例如:
name | total_score | result |
---|---|---|
Alice | 180 | No |
Bob | 220 | Yes |
Charlie | 190 | No |
示例 2:对查询结果进行分类汇总
假设我们有一个包含产品销售记录的表格,其中包括产品的名称、销售数量和销售日期。我们想要对每个产品在不同月份的销售量进行汇总,并且按照产品名称和月份进行分类。
我们可以使用 CASE
表达式来实现这个需求。以下是示例代码:
SELECT ProductName,
CASE
WHEN MONTH(SalesDate) = 1 THEN 'January'
WHEN MONTH(SalesDate) = 2 THEN 'February'
WHEN MONTH(SalesDate) = 3 THEN 'March'
WHEN MONTH(SalesDate) = 4 THEN 'April'
WHEN MONTH(SalesDate) = 5 THEN 'May'
WHEN MONTH(SalesDate) = 6 THEN 'June'
WHEN MONTH(SalesDate) = 7 THEN 'July'
WHEN MONTH(SalesDate) = 8 THEN 'August'
WHEN MONTH(SalesDate) = 9 THEN 'September'
WHEN MONTH(SalesDate) = 10 THEN 'October'
WHEN MONTH(SalesDate) = 11 THEN 'November'
WHEN MONTH(SalesDate) = 12 THEN 'December'
END AS MonthName,
SUM(SalesQuantity) AS TotalSales
FROM Sales
GROUP BY ProductName,
CASE
WHEN MONTH(SalesDate) = 1 THEN 'January'
WHEN MONTH(SalesDate) = 2 THEN 'February'
WHEN MONTH(SalesDate) = 3 THEN 'March'
WHEN MONTH(SalesDate) = 4 THEN 'April'
WHEN MONTH(SalesDate) = 5 THEN 'May'
WHEN MONTH(SalesDate) = 6 THEN 'June'
WHEN MONTH(SalesDate) = 7 THEN 'July'
WHEN MONTH(SalesDate) = 8 THEN 'August'
WHEN MONTH(SalesDate) = 9 THEN 'September'
WHEN MONTH(SalesDate) = 10 THEN 'October'
WHEN MONTH(SalesDate) = 11 THEN 'November'
WHEN MONTH(SalesDate) = 12 THEN 'December'
END
ORDER BY ProductName,
MONTH(SalesDate)
在上面的代码中,我们使用了 CASE 表达式将每个销售日期所对应的月份转换为月份名称,并且对结果进行了分组和汇总,最后按照产品名称和月份进行了排序。
以下是示例结果:
ProductName | MonthName | TotalSales |
---|---|---|
Product A | January | 50 |
Product A | February | 20 |
Product A | March | 30 |
Product A | April | 10 |
Product B | January | 40 |
Product B | February | 25 |
Product B | March | 15 |
Product B | April | 5 |
从上面的结果可以看出,我们成功地将每个产品在不同月份的销售量进行了分类汇总,并且按照产品名称和月份进行了排序。
结论
CASE
表达式是一个非常强大的表达式,它可以在查询中根据不同的条件进行逻辑判断,并返回不同的结果。通过 CASE
表达式,我们可以轻松地实现复杂的逻辑运算和数据转换。此外,在结合其他表达式一起使用时,CASE
表达式也可以发挥出更大的作用。但需要注意的是,在使用 CASE
表达式时要注意语法的正确性和逻辑的合理性,以避免出现错误的结果。