目录
一、CASE WHEN的语法形态
(一)形态一:CASE WHEN 表达式 THEN 结果
(二)形态二:CASE 变量 WHEN 值 THEN 结果
二、case when的应用场景
(一)SELECT 子句中
(二)WHERE 子句中
(三)GROUP BY 子句中
(四)ORDER BY 子句中
(五)HAVING 子句中
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END
在这个语法中,CASE 表示开始一个 CASE WHEN 表达式,WHEN 表示一个条件分支,THEN 表示条件成立时返回的结果,ELSE 表示所有分支都不成立时返回的默认结果,END 表示结束整个 CASE WHEN 表达式。
condition 可以是任意的逻辑表达式,例如 a > b、c IS NULL 等等。result 可以是任何类型的值,例如数字、字符串、日期等等。在 CASE WHEN 表达式中,可以有任意多个 WHEN 分支,但最多只能有一个 ELSE 分支。
SELECT name, age,
CASE
WHEN age < 18 THEN '未成年'
WHEN age < 60 THEN '成年'
ELSE '老年'
END AS age_group
FROM people;
CASE column_name
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE default_result
END
在这种语法中,column_name 表示要进行分类或分段处理的列名,value 表示要匹配的数值,result 表示匹配成功时返回的结果,ELSE 表示所有分支都不匹配时返回的默认结果。
SELECT id, score,
CASE score
WHEN 0 THEN '未参加考试'
WHEN 1 THEN '不及格'
WHEN 2 THEN '及格'
WHEN 3 THEN '中等'
WHEN 4 THEN '良好'
WHEN 5 THEN '优秀'
ELSE '其他'
END AS level
FROM exam_results;
可以使用 CASE WHEN 表达式根据某个条件返回不同的结果,例如对某个数值进行分类、对日期进行格式化等等。
使用示例
SELECT
column1,
column2,
CASE
WHEN column3 < 10 THEN '较小'
WHEN column3 < 20 THEN '中等'
ELSE '较大'
END AS column3_level
FROM table_name;
可以使用 CASE WHEN 表达式筛选满足某个条件的数据,例如筛选某个数值范围内的数据、筛选某个日期之后或之前的数据等等。
使用示例
SELECT * FROM table_name
WHERE
CASE
WHEN column1 = 'A' THEN column2 > 10
WHEN column1 = 'B' THEN column2 < 20
ELSE column2 = 0
END;
在这个示例中,WHERE 子句中使用 CASE WHEN 表达式根据 column1 的值进行条件筛选。如果 column1 的值为 ‘A’,则筛选 column2 大于 10 的数据;如果 column1 的值为 ‘B’,则筛选 column2 小于 20 的数据;否则筛选 column2 等于 0 的数据。
可以使用 CASE WHEN 表达式对数据进行分组,例如对某个数值进行分段、对某个字符串进行分类等等。
使用示例
SELECT
CASE
WHEN column1 < 10 THEN '小于 10'
WHEN column1 < 20 THEN '10 到 20'
ELSE '大于 20'
END AS column1_range,
COUNT(*) AS count
FROM table_name
GROUP BY
CASE
WHEN column1 < 10 THEN '小于 10'
WHEN column1 < 20 THEN '10 到 20'
ELSE '大于 20'
END;
在这个示例中,GROUP BY 子句中使用 CASE WHEN 表达式对 column1 进行分段处理,并统计每个分段的数据量。最终的查询结果包含 column1_range 和 count 两列,其中 column1_range 表示 column1 的分段范围,count 表示该分段内数据的数量。
可以使用 CASE WHEN 表达式对数据进行排序,例如将某个字符串按照指定的顺序排序、将某个数值按照指定的范围排序等等。
使用示例
SELECT *
FROM table_name
ORDER BY
CASE column1
WHEN 'A' THEN 1
WHEN 'B' THEN 2
WHEN 'C' THEN 3
ELSE 4
END;
在这个示例中,ORDER BY 子句中使用 CASE WHEN 表达式对 column1 进行分类排序。如果 column1 的值为 ‘A’,则排在最前面;如果 column1 的值为 ‘B’,则排在第二个;如果 column1 的值为 ‘C’,则排在第三个;否则排在最后面。最终的查询结果按照 column1 的分类顺序进行排序。
可以使用 CASE WHEN 表达式筛选已分组的数据,例如筛选某个分组中满足某个条件的数据等等。
使用示例一
SELECT
column1,
AVG(column2) AS avg_column2
FROM table_name
GROUP BY column1
HAVING
CASE
WHEN column1 = 'A' THEN AVG(column2) > 10
WHEN column1 = 'B' THEN AVG(column2) < 20
ELSE AVG(column2) = 0
END;
在这个示例中,HAVING 子句中使用 CASE WHEN 表达式根据 column1 的值对已分组的数据进行条件筛选。如果 column1 的值为 ‘A’,则筛选平均值大于 10 的数据;如果 column1 的值为 ‘B’,则筛选平均值小于 20 的数据;否则筛选平均值等于 0 的数据。最终的查询结果包含 column1和avg_column2两列,其中avg_column2表示每个分组内column2的平均值,且满足 HAVING 子句中的条件。
tips:
还可以配合SUM()、MAX()、MIN()等聚合函数在HAVING中使用
使用示例二
SELECT column1, AVG(column2) AS avg_column2
FROM table_name
GROUP BY column1
HAVING SUM(CASE
WHEN column1 = 'A' AND column2 > 100 THEN 1
WHEN column1 = 'B' AND column2 < 20 THEN 1
ELSE 0
END) > 0;
HAVING SUM(CASE … END) > 0:对分组后的结果进行筛选,只保留满足以下条件的分组:
分组中至少存在一条记录满足以下条件之一:
- column1 的值为 ‘A’,且 column2 的值大于 100。
- column1 的值为 ‘B’,且 column2 的值小于 20。
使用 SUM 函数对满足条件的记录数量进行计数,如果该数量大于 0,则保留该分组。否则,排除该分组。