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;