ORACLE CASE WHEN 及 SELECT CASE WHEN的用法

本文详细介绍了SQL中的CASE语句的不同形式及其应用场景,包括CASE选择器、CASE搜索语句及CASE表达式等,并通过实例展示了如何在PL/SQL块中使用CASE语句进行条件判断以及如何在SELECT语句中结合CASE WHEN进行复杂查询。

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

 CASE 语句

CASE selector
   WHEN value1 THEN action1;
   WHEN value2 THEN action2;
   WHEN value3 THEN action3;
   …..
   ELSE actionN;
END CASE;

CASE表达式

DECLARE
   temp VARCHAR2(10);
   v_num number;
BEGIN
   v_num := &i;
   temp := CASE v_num
     WHEN 0 THEN 'Zero'
      WHEN 1 THEN 'One'
     WHEN 2 THEN 'Two'
   ELSE
       NULL
   END;
   dbms_output.put_line('v_num = '||temp);
END;
/

CASE搜索语句

CASE
   WHEN (boolean_condition1) THEN action1;
   WHEN (boolean_condition2) THEN action2;
   WHEN (boolean_condition3) THEN action3;
   ……
   ELSE    actionN;
END CASE;

CASE搜索表达式 

DECLARE
   a number := 20;
   b number := -40;
   tmp varchar2(50);
BEGIN
   tmp := CASE
              WHEN (a>b) THEN 'A is greater than B'
              WHEN (a<b) THEN 'A is less than B'
              ELSE
              'A is equal to B'
              END;
   dbms_output.put_line(tmp);
END;
/

SELECT CASE WHEN 的用法

select 与 case结合使用最大的好处有两点,一是在显示查询结果时可以灵活的组织格式,二是有效避免了多次对同一个表或几个表的访问。下面举个简单的例子来说明。例如表 students(id, name ,birthday, sex, grade),要求按每个年级统计男生和女生的数量各是多少,统计结果的表头为,年级,男生数量,女生数量。如果不用select case when,为了将男女数量并列显示,统计起来非常麻烦,先确定年级信息,再根据年级取男生数和女生数,而且很容易出错。用select case when写法如下:
SELECT   grade, COUNT (CASE WHEN sex = 1 THEN 1      /*sex 1为男生,2位女生*/
                                            ELSE NULL
                                            END) 男生数,
                            COUNT (CASE WHEN sex = 2 THEN 1
                                            ELSE NULL
                                            END) 女生数
    FROM students GROUP BY grade;

Oracle SQL 中的 `CASE WHEN` 语句是一种强大的条件表达式,用于在查询中实现逻辑判断。它类似于编程语言中的 if-else 结构,允许根据不同的条件返回不同的值。`CASE WHEN` 在 SQL 查询、视图、PL/SQL 过程中广泛使用,尤其适用于数据转换、分类汇总等场景。 ### 基本语法结构 ```sql CASE WHEN condition_1 THEN result_1 WHEN condition_2 THEN result_2 ... ELSE default_result END ``` - `condition_n` 是布尔表达式,如果为真,则返回对应的 `result_n`。 - `ELSE` 子句是可选的,当所有 `WHEN` 条件都不满足时返回 `default_result`。 - 如果没有指定 `ELSE` 并且没有任何匹配项,则返回 `NULL`。 ### 示例说明 #### 示例 1:基本用法 以下示例展示了如何在 `SELECT` 语句中使用 `CASE WHEN` 来对员工的薪资进行分类: ```sql SELECT employee_id, salary, CASE WHEN salary < 3000 THEN 'Low' WHEN salary BETWEEN 3000 AND 6000 THEN 'Medium' WHEN salary > 6000 THEN 'High' END AS salary_level FROM employees; ``` 在这个例子中,根据员工的薪资水平将其分为“Low”、“Medium”或“High”三个等级[^1]。 #### 示例 2:结合聚合函数使用 `CASE WHEN` 可以与聚合函数一起使用,例如统计不同类别的记录数量: ```sql SELECT department_id, COUNT(*) AS total_employees, SUM(CASE WHEN salary < 3000 THEN 1 ELSE 0 END) AS low_salary_count FROM employees GROUP BY department_id; ``` 此查询将统计每个部门中薪资低于 3000 的员工人数。 #### 示例 3:嵌套 CASE WHEN 可以嵌套多个 `CASE WHEN` 表达式来处理更复杂的逻辑: ```sql SELECT order_id, customer_id, CASE WHEN order_amount > 1000 THEN CASE WHEN customer_type = 'VIP' THEN 'High Priority - VIP' ELSE 'High Priority' END ELSE 'Normal Priority' END AS priority_level FROM orders; ``` 这个例子中,订单优先级不仅取决于订单金额,还取决于客户类型[^1]。 ### 注意事项 - **PL/SQL 中的行为差异**:在 PL/SQL 块中使用 `CASE` 语句时,如果没有匹配的条件且未指定 `ELSE` 子句,Oracle 将抛出错误(如引用中提到的 ORA-06592)。 - **性能优化**:虽然 `CASE WHEN` 提供了灵活性,但在复杂查询中频繁使用可能会影响性能,建议合理使用索引和优化查询结构。 - **可读性**:对于非常复杂的条件逻辑,建议适当注释并保持代码结构清晰,以便维护和调试。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值