SQL语法之CASE WHEN的使用总结

《SQL语法之CASE WHEN的使用总结》

目录

一、CASE WHEN的语法形态
(一)形态一:CASE WHEN 表达式 THEN 结果
(二)形态二:CASE 变量 WHEN 值 THEN 结果
二、case when的应用场景
(一)SELECT 子句中
(二)WHERE 子句中
(三)GROUP BY 子句中
(四)ORDER BY 子句中
(五)HAVING 子句中


一、CASE WHEN的语法形态

(一)形态一:CASE WHEN 表达式 THEN 结果

  1. 基本语法如下
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 分支。

  1. 使用示例
SELECT name, age,
  CASE
    WHEN age < 18 THEN '未成年'
    WHEN age < 60 THEN '成年'
    ELSE '老年'
  END AS age_group
FROM people;

(二)形态二:CASE 变量 WHEN 值 THEN 结果

  1. 基本语法如下
CASE column_name
  WHEN value1 THEN result1
  WHEN value2 THEN result2
  ...
  ELSE default_result
END

在这种语法中,column_name 表示要进行分类或分段处理的列名,value 表示要匹配的数值,result 表示匹配成功时返回的结果,ELSE 表示所有分支都不匹配时返回的默认结果。

  1. 使用示例
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 子句中

可以使用 CASE WHEN 表达式根据某个条件返回不同的结果,例如对某个数值进行分类、对日期进行格式化等等。
使用示例

SELECT
  column1,
  column2,
  CASE
    WHEN column3 < 10 THEN '较小'
    WHEN column3 < 20 THEN '中等'
    ELSE '较大'
  END AS column3_level
FROM table_name;

(二)WHERE 子句中

可以使用 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 的数据。

(三)GROUP BY 子句中

可以使用 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 表示该分段内数据的数量。

(四)ORDER BY 子句中

可以使用 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 的分类顺序进行排序。

(五)HAVING 子句中

可以使用 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,则保留该分组。否则,排除该分组。

你可能感兴趣的:(DB,sql,数据库)