SQL的case when then else end语句的用法

本文介绍 SQL 中 Case 函数的应用技巧,包括简单 Case 函数和 Case 搜索函数的区别及使用场景,并通过具体案例展示了如何利用 Case 函数进行复杂的数据分组和统计分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

case具有两种格式。简单case函数和case搜索函数。


这两种方式,可以实现相同的功能。简单情况下函数的写法相对比较简洁,但是和壳体搜索函数相比,功能方面会有些限制,比如写判定式。 

还有一个需要注重的问题,情况下函数只返回第一个符合条件的值,剩下的情况下,部分将会被自动忽略。



一,已知数据按照另外一种方式进行分组,分析。(分组函数+case函数)

如有以下数据

国家

人口

中国

600

美国

100

加拿大

100

英国

200

法国

300

日本

250

德国

200

墨西哥

50

印度

250

统计亚洲和北美洲的人口数量,怎么求?

通过案例函数,SQL如下


原理:我们要统计每个洲的人数,首先要将国家按洲来分组,中国,日本,印度是亚洲,美国,加拿大,墨西哥是美洲,实现分组后,通过求和聚合函数就能查出每个洲多少人

但是呢!没有洲名明显不能满足我们的要求,那怎么才能加上洲名呢?受分组函数的限制,select后面加列只能是聚合函数和被分组的列,此处被分组的列为country,那我们能直接用country吗?当然不能,因为country这个列的原本的分组逻辑已经改变了,而如果要查询这个列就得用被修改后的分组逻辑来查


人口

亚洲

1100

北美洲

250

其他

700

例2:

姓名

工资

小王

800

小张

450

小陈

100

小明

250

小赵

300

小李

650

小沈

500

小孙

50

小唐

700

其中我们根据工资分为4个等0~200等级1 200~400等级2 400~600等级3 600~800等级4

select 
    count(*) as count
    case when salary>=0 and salary<200 then '等级1'
    when  salary>=200 and salary<400 then '等级2'
    when  salary>=400 and salary<600 then '等级3'
    when  salary>=600 and salary<=800 then '等级4'
    else null end as Grade 
from Payroll group by 
    case when salary>=0 and salary<200 then '等级1'
    when  salary>=200 and salary<400 then '等级2'
    when  salary>=400 and salary<600 then '等级3'
    when  salary>=600 and salary<=800 then '等级4'

    else null end;

countgrade
2等级1
2等级2
2等级3
3等级4


二,用一个sql语句完成不同条件的分组

有如下数据

国家(country)性别(sex)人口(population)
中国1340
中国2260
美国145
美国255
加拿大151
加拿大249
英国140
英国260

需求:按照国家和性别进行分组

国家

思路:以country分组,显示的列为country和对应的聚合函数,那聚合函数怎么构造出'男'和'女'列呢?

很简单,对分组后的sex列做判断,如果sex=1,表示为男,此时统计男性总数,sex=2,表示为女,统计女性总数

SELECT country,
       -- 原理:分组后,是对组进行操作,第二列的意思就是取此组中,sex=1的记录的population的总和
       
SUM( CASE WHEN sex = '1' THEN 
                      population ELSE 0 END) as 男,  
       
SUM( CASE WHEN sex = '2' THEN 
                      population ELSE 0 END) as 女   
FROM
  sex_count

GROUP BY country;



三,check中使用case函数

扩展:check约束用于限制列中值的取值范围


需求:插入的女职工记录条中的工资必须大于1000

create table sex_salary(
      name varchar(24),
      sex number,
      salary number,
     
CONSTRAINT check_salary CHECK
           ( CASE WHEN sex = 2
                  THEN CASE WHEN price > 1000 THEN 1 ELSE 0 END
                  ELSE 1 END = 1 )

)

如果单纯使用check,但是这样的话,女职员的条件可以符合,但男职员就无法输入了

CONSTRAINT check_salary CHECK
           ( sex = '2' AND salary > 1000 )














在 PL/SQL 中,`CASE WHEN THEN ELSE END CASE` 语句是一种用于条件判断的结构化控制流语句。它允许根据不同的条件执行不同的操作。该语句有两种形式:**简单 CASE 表达式**和**搜索 CASE 表达式**。 ### 基本语法 #### 简单 CASE 表达式 ```plsql CASE selector WHEN value1 THEN result1 WHEN value2 THEN result2 ... [ELSE default_result] END; ``` - `selector` 是一个表达式,其结果将与各个 `WHEN` 子句中的值进行比较。 - 如果 `selector` 的值等于某个 `WHEN` 子句中的值,则执行对应的 `THEN` 后的结果。 - 如果没有匹配的值,并且存在 `ELSE` 子句,则执行 `ELSE` 后的结果;否则会抛出 `CASE_NOT_FOUND` 异常。 #### 搜索 CASE 表达式 ```plsql CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... [ELSE default_result] END; ``` - 不需要指定 `selector`,而是直接评估每个 `WHEN` 子句中的布尔条件。 - 第一个为真的条件决定要执行的 `THEN` 分支。 - 如果所有条件都为假,并且存在 `ELSE` 子句,则执行 `ELSE` 后的结果;否则会抛出 `CASE_NOT_FOUND` 异常。 ### 使用示例 #### 示例 1:简单 CASE 表达式 ```plsql DECLARE grade CHAR(1) := 'B'; message VARCHAR2(50); BEGIN message := CASE grade WHEN 'A' THEN 'Excellent' WHEN 'B' THEN 'Good' WHEN 'C' THEN 'Average' ELSE 'Fail' END; DBMS_OUTPUT.PUT_LINE(message); -- 输出: Good END; ``` #### 示例 2:搜索 CASE 表达式 ```plsql DECLARE score NUMBER := 85; result VARCHAR2(50); BEGIN result := CASE WHEN score >= 90 THEN 'Grade A' WHEN score >= 80 THEN 'Grade B' WHEN score >= 70 THEN 'Grade C' ELSE 'Fail' END; DBMS_OUTPUT.PUT_LINE(result); -- 输出: Grade B END; ``` ### 注意事项 - 在使用 `CASE` 语句时,建议始终包含 `ELSE` 子句以避免触发 `CASE_NOT_FOUND` 异常。 - 如果省略了 `ELSE` 子句并且没有任何条件满足,则会引发 `CASE_NOT_FOUND` 异常[^3]。 ### 异常处理示例 为了捕获 `CASE_NOT_FOUND` 异常,可以在 PL/SQL 块中添加异常处理部分: ```plsql DECLARE p INT := 0; q INT := 0; r INT := 0; BEGIN CASE WHEN p = 1 THEN NULL; -- Action1 WHEN r = 2 THEN NULL; -- Action2 WHEN q > 1 THEN NULL; -- Action3 END CASE; EXCEPTION WHEN CASE_NOT_FOUND THEN DBMS_OUTPUT.PUT_LINE('Trapped: case_not_found'); END; ``` ### 总结 `CASE WHEN THEN ELSE END` 语句提供了灵活的方式来根据不同的条件执行不同的逻辑。通过合理地使用 `CASE` 语句,可以提高代码的可读性和维护性。同时,在编写 `CASE` 语句时,务必考虑异常情况并适当处理以确保程序的健壮性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值