
# CASE...WHEN
#### 功能描述
CASE...WHEN是条件表达式，用于根据条件返回不同的值。Spark SQL支持简单CASE函数和CASE搜索函数两种形式。
#### 语法格式
简单CASE函数：依据expression与value1的匹配结果跳转到相应的result1。
```
CASE expression
   WHEN value1 THEN result1
   [ WHEN value2 THEN result2 ] ...
   [ ELSE else_result ]
 END
```
CASE搜索函数：按指定顺序为每个WHEN子句的condition1求值。返回第一个取值为TRUE的condition1的result1。
```
CASE
  WHEN condition1 THEN result1 
  [ WHEN condition2 THEN result2 ] ...
  [ ELSE else_result ]
END
```
#### 参数说明
| 参数               | 说明                                       |
|:---|:---|
| expression       | 简单CASE中被比较的表达式。                          |
| WHEN value       | 简单CASE中，当expression等于value时，返回对应的THEN结果。 |
| WHEN condition   | CASE搜索函数中，当condition为真时，返回对应的THEN结果。     |
| THEN result      | 满足条件时返回的结果。所有THEN结果的类型应一致。               |
| ELSE else_result | 所有WHEN条件都不满足时返回的结果。如省略ELSE，则返回NULL。      |
   
#### 注意事项
- 简单CASE函数使用等值比较（=），CASE搜索函数支持任意布尔条件。
- CASE表达式从上到下依次判断，返回第一个满足条件的THEN结果，后续条件不再判断。
- 所有THEN和ELSE返回值的类型应一致或可隐式转换。
- CASE表达式可以用于SELECT列表、WHERE条件、ORDER BY、GROUP BY等任意需要表达式的地方。
 
#### 示例
- **简单CASE函数**
  返回表student中的字段name及与class_id相匹配的字符。
  ```
  SELECT name,
     CASE class_id
       WHEN 1 THEN 'Class A'
       WHEN 2 THEN 'Class B'
       WHEN 3 THEN 'Class C'
       ELSE 'Other'
     END AS class_name
     FROM student;
  ```
  
- **CASE搜索函数**
  对表student进行查询，返回字段name及与score对应的结果，score大于等于90返回EXCELLENT，score在（80,90）之间的返回GOOD，否则返回BAD。
  ```
  SELECT name, 
    CASE
     WHEN score >= 90 THEN 'EXCELLENT' 
     WHEN 80 < score AND score < 90 THEN 'GOOD' 
     ELSE 'BAD' 
    END AS level 
    FROM student;
  ```
  
- **CASE在ORDER BY中使用**
  ```
  SELECT name, score FROM student
     ORDER BY CASE WHEN score >= 60 THEN 0 ELSE 1 END, score DESC;
  ```
  
- **CASE在聚合中使用**
  ```
  SELECT class_id,
     COUNT(CASE WHEN score >= 90 THEN 1 END) AS excellent_count,
     COUNT(CASE WHEN score < 60 THEN 1 END) AS fail_count
     FROM student
     GROUP BY class_id;
  ```
  
 
