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 表达式时要注意语法的正确性和逻辑的合理性,以避免出现错误的结果。