文章目录
前言
Case具有两种格式:简单Case函数和Case搜索函数。
一:简单Case函数
case sex
when '1' then '男'
when '2' then '女'
else '其他' end
二:Case搜索函数
case
when sex = '1' then '男'
when sex = '2' then '女'
else '其他' end
这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。
比如说,下面这段sql,你永远无法得到“第二类”这个结果
case
when col_1 in ( 'a', 'b') then '第一类'
when col_1 in ('a') then '第二类'
else'其他' end
THEN后边的值与ELSE后边的值类型应一致,否则会报错。如下:
CASE SCORE WHEN 'A' THEN '优' ELSE 0 END
'优’和0数据类型不一致则报错:
[Err] ORA-00932: 数据类型不一致: 应为 CHAR, 但却获得 NUMBER
下面介绍几种常用场景。
场景1:有分数score,score<60返回不及格,score>=60返回及格,score>=80返回优秀
SELECT
STUDENT_NAME,
(CASE WHEN score < 60 THEN '不及格'
WHEN score >= 60 AND score < 80 THEN '及格'
WHEN score >= 80 THEN '优秀'
ELSE '异常' END) AS REMARK
FROM
TABLE
注意:如果你想判断score是否null的情况,WHEN score = null THEN ‘缺席考试’,这是一种错误的写法,正确的写法应为:
CASE WHEN score IS NULL THEN '缺席考试' ELSE '正常' END
场景2:现老师要统计班中,有多少男同学,多少女同学,并统计男同学中有几人及格,女同学中有几人及格,要求用一个SQL输出结果。
表结构如下:其中STU_SEX字段,0表示男生,1表示女生。
STU_CODE | STU_NAME | STU_SEX | STU_SCORE |
---|---|---|---|
XM | 小明 | 0 | 88 |
XL | 小磊 | 0 | 55 |
XF | 小峰 | 0 | 45 |
XH | 小红 | 1 | 66 |
XN | 晓妮 | 1 | 77 |
XY | 小伊 | 1 | 99 |
SELECT
SUM (CASE WHEN STU_SEX = 0 THEN 1 ELSE 0 END) AS MALE_COUNT,
SUM (CASE WHEN STU_SEX = 1 THEN 1 ELSE 0 END) AS FEMALE_COUNT,
SUM (CASE WHEN STU_SCORE >= 60 AND STU_SEX = 0 THEN 1 ELSE 0 END) AS MALE_PASS,
SUM (CASE WHEN STU_SCORE >= 60 AND STU_SEX = 1 THEN 1 ELSE 0 END) AS FEMALE_PASS
FROM
THTF_STUDENTS
输出结果如下:
MALE_COUNT | FEMALE_COUNT | MALE_PASS | FEMALE_PASS |
---|---|---|---|
3 | 3 | 1 | 3 |
场景3:CASE 语句放在 WHERE 子句中进行条件过滤
-
在 SQL 中,CASE 语句不能直接放在 WHERE 子句中进行条件过滤,因为 CASE 语句是用来处理选择逻辑的,而不是用来过滤行的。
-
如果你想根据条件筛选行,可以使用 CASE 语句生成一个虚拟列,然后在 WHERE 子句中过滤这个虚拟列的值。以下是一个示例:
SELECT *
FROM your_table
WHERE
(CASE
WHEN ton > 1000 THEN
CASE
WHEN ton / 1000 > 12 THEN '大于12'
ELSE '不大于12'
END
ELSE
CASE
WHEN ton > 12 THEN '大于12'
ELSE '不大于12'
END
END) = '大于12';
- 在这个示例中,CASE 语句生成了一个名为 result 的虚拟列,然后在 WHERE 子句中筛选出 result 列的值为 ‘大于12’ 的行。这样就可以根据条件判断筛选出符合要求的行了。
请注意,这种方法会增加查询的复杂度,特别是对于大型数据集。确保你的数据库和查询逻辑能够处理这种额外的计算。
总结
如果此篇文章有帮助到您, 希望打大佬们能
关注
、点赞
、收藏
、评论
支持一波,非常感谢大家!
如果有不对的地方请指正!!!