oracle sql case when语句
时间: 2025-07-04 12:13:31 浏览: 20
在 Oracle SQL 中,`CASE WHEN` 语句是一种条件表达式,用于根据不同的条件返回不同的值。它可以在 `SELECT`、`WHERE`、`ORDER BY` 等子句中使用,也可以嵌套在其他表达式中,从而增强 SQL 的灵活性和可读性。
### 基本语法结构
```sql
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END
```
其中:
- `condition` 是判断条件,通常为布尔表达式。
- `result` 是当对应条件成立时返回的值。
- `ELSE` 子句是可选的,用于处理没有满足任何条件的情况,默认为 `NULL`,但在 PL/SQL 中会报错。
### 使用场景及示例
#### 在 SELECT 子句中的应用
以下示例展示如何在 `SELECT` 语句中使用 `CASE WHEN` 对员工的薪资进行分类:
```sql
SELECT employee_id,
salary,
CASE
WHEN salary < 3000 THEN 'Low'
WHEN salary BETWEEN 3000 AND 7000 THEN 'Medium'
WHEN salary > 7000 THEN 'High'
ELSE 'Unknown'
END AS salary_level
FROM employees;
```
上述查询将根据 `salary` 字段的值返回一个描述性的薪资等级,例如 `'Low'`、`'Medium'` 或 `'High'` [^1]。
#### 在 WHERE 子句中的应用
`CASE WHEN` 可以用作动态过滤数据的工具。例如,根据某个参数的值来决定过滤条件:
```sql
SELECT *
FROM employees
WHERE CASE
WHEN department_id = 10 THEN 'Finance'
WHEN department_id = 20 THEN 'HR'
ELSE 'Other'
END = 'HR';
```
此查询将仅返回部门编号为 20 的员工记录 [^1]。
#### 处理未匹配情况
如果省略 `ELSE` 子句且没有任何条件匹配,则在 SQL 查询中会返回 `NULL`,而在 PL/SQL 中会抛出错误(如 ORA-06592)[^2]。因此,在实际开发中建议始终包含 `ELSE` 分支以避免意外行为。
#### 与 DECODE 函数对比
虽然 `DECODE` 函数可以实现简单的条件判断,但其语法较为局限,只能处理等值比较。相比之下,`CASE WHEN` 支持更复杂的逻辑判断,包括范围比较和组合条件。
例如,使用 `DECODE` 实现职位映射:
```sql
SELECT job_id,
DECODE(job_id, 'AD_PRES', 'A', 'ST_MAN', 'B', 'IT_PROG', 'C', 'SA_REP', 'D', 'ST_CLERK', 'E') AS JOB
FROM employees;
```
而 `CASE WHEN` 可以支持更灵活的条件判断,例如结合 `LIKE`、`BETWEEN` 等操作符 [^3]。
---
阅读全文
相关推荐




















