Sql case when then else end
时间: 2025-06-12 21:11:36 浏览: 20
<think>我们正在讨论SQL中的CASE表达式。根据用户的问题,他们希望了解CASEWHENTHENELSEEND的语法、示例和使用方法。同时,用户提供了几个引用,这些引用都指向了CASE表达式的相关解释。CASE表达式有两种形式:1.简单CASE表达式:将某个表达式与一组简单值进行比较。2.搜索CASE表达式:评估一组布尔表达式,返回第一个为真的表达式对应的结果。语法:1.简单CASE:CASE表达式WHEN值1THEN结果1WHEN值2THEN结果2...ELSE默认结果END2.搜索CASE:CASEWHEN条件1THEN结果1WHEN条件2THEN结果2...ELSE默认结果END我们将通过示例来说明这两种形式。示例1(简单CASE):根据职位ID返回等级。```sqlSELECTjob_id,CASEjob_idWHEN'AD_PRES'THEN'A'WHEN'ST_MAN'THEN'B'WHEN'IT_PROG'THEN'C'WHEN'SA_REP'THEN'D'WHEN'ST_CLERK'THEN'E'ELSE'0'--或者使用to_char(0)转换为字符串,但这里直接写字符串'0'ENDASjob_gradeFROMemployees;```注意:在引用[4]中,ELSE子句使用了to_char(0),这是因为在Oracle中,如果前面的结果都是字符,而ELSE返回的是数字0,类型不匹配会报错,所以需要转换。但在其他数据库中,可能需要类似处理或者直接写'0'(字符串)。示例2(搜索CASE):根据薪水将员工分为不同级别。```sqlSELECTemployee_id,salary,CASEWHENsalary<3000THEN'低'WHENsalaryBETWEEN3000AND6000THEN'中'WHENsalary>6000THEN'高'ELSE'未知'ENDASsalary_levelFROMemployees;```示例3(在UPDATE语句中使用CASE):根据条件更新员工薪水。```sqlUPDATEemployeesSETsalary=CASEWHENdepartment_id=10THENsalary*1.1WHENdepartment_id=20THENsalary*1.05ELSEsalary*1.02END;```示例4(在聚合函数中使用CASE):统计不同薪资水平的人数。```sqlSELECTCOUNT(*)AStotal,COUNT(CASEWHENsalary<3000THEN1END)ASlow_count,COUNT(CASEWHENsalaryBETWEEN3000AND6000THEN1END)ASmid_count,COUNT(CASEWHENsalary>6000THEN1END)AShigh_countFROMemployees;```注意:这里COUNT函数只计算非NULL值,所以当条件不满足时,CASE返回NULL,不会被计数。使用注意事项:1.CASE表达式按顺序评估条件,一旦条件满足,就返回对应的结果,并跳过后续条件。2.ELSE子句是可选的,如果省略且没有任何条件满足,则返回NULL。3.确保条件没有重叠,或者注意条件的顺序(因为顺序很重要)。4.结果的数据类型应兼容,如果不兼容,可能需要转换(如示例1中提到的类型问题)。与COALESCE的关系:COALESCE可以看作是CASE的一种特例。例如:```sqlCOALESCE(a,b,c)--等价于CASEWHENaISNOTNULLTHENaWHENbISNOTNULLTHENbELSEcEND```但是,COALESCE更简洁,且通常有优化。最后,生成相关问题。</think>### SQL CASE WHEN THEN ELSE END 语法详解
`CASE WHEN THEN ELSE END` 是 SQL 中强大的条件表达式,用于实现灵活的条件分支逻辑。以下是完整语法解析和实用示例:
---
#### 一、基础语法结构
##### 1. 简单形式(值匹配)
```sql
CASE 列名/表达式
WHEN 值1 THEN 结果1
WHEN 值2 THEN 结果2
...
ELSE 默认结果
END
```
> **示例**:员工职级分类
> ```sql
> SELECT employee_id,
> CASE job_id
> WHEN 'AD_PRES' THEN 'A级'
> WHEN 'ST_MAN' THEN 'B级'
> WHEN 'IT_PROG' THEN 'C级'
> ELSE '其他'
> END AS job_level
> FROM employees; -- 引用[4]
> ```
##### 2. 搜索形式(条件判断)
```sql
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
...
ELSE 默认结果
END
```
> **示例**:薪资分段统计
> ```sql
> SELECT employee_id, salary,
> CASE
> WHEN salary < 5000 THEN '低薪'
> WHEN salary BETWEEN 5000 AND 10000 THEN '中薪'
> WHEN salary > 10000 THEN '高薪'
> ELSE '未定义'
> END AS salary_level
> FROM employees;
> ```
---
#### 二、核心应用场景
##### 1. 数据转换与分类
```sql
-- 消息类型转换(二进制→文本)
SELECT
datetime(CreateTime, 'unixepoch', 'localtime') AS 时间,
Message AS 内容,
CASE Des
WHEN 0 THEN '乐'
ELSE '园'
END AS 类型 -- 引用[5]
FROM message_log;
```
##### 2. 动态列值生成
```sql
-- 销售业绩评级
SELECT
salesperson_id,
total_sales,
CASE
WHEN total_sales > 100000 THEN '金牌'
WHEN total_sales > 50000 THEN '银牌'
ELSE '铜牌'
END AS performance_rank
FROM sales;
```
##### 3. 条件聚合统计
```sql
-- 多条件计数统计
SELECT
department_id,
COUNT(*) AS total,
COUNT(CASE WHEN salary > 10000 THEN 1 END) AS high_salary_count,
SUM(CASE WHEN job_id = 'IT_PROG' THEN 1 ELSE 0 END) AS it_staff_count
FROM employees
GROUP BY department_id;
```
##### 4. UPDATE 语句中的条件更新
```sql
-- 有条件调整薪资
UPDATE employees
SET salary = CASE
WHEN hire_date < '2020-01-01' THEN salary * 1.1
WHEN department_id = 10 THEN salary * 1.05
ELSE salary * 1.03
END;
```
---
#### 三、进阶技巧
##### 1. 嵌套 CASE 表达式
```sql
-- 多层条件判断
SELECT product_id,
CASE
WHEN stock > 100 THEN '充足'
WHEN stock <= 100 THEN
CASE
WHEN reorder_flag = 1 THEN '需补货'
ELSE '预警'
END
ELSE '缺货'
END AS stock_status
FROM inventory;
```
##### 2. 与聚合函数结合
```sql
-- 动态条件聚合
SELECT
AVG(CASE WHEN department = 'IT' THEN salary END) AS it_avg_salary,
MAX(CASE WHEN gender = 'F' THEN hire_date END) AS latest_female_hire
FROM employees;
```
##### 3. NULL 值处理
```sql
-- 处理空值并转换
SELECT order_id,
CASE
WHEN discount IS NULL THEN '无折扣'
WHEN discount = 0 THEN '零折扣'
ELSE TO_CHAR(discount, '0.00%')
END AS discount_status
FROM orders;
```
---
#### 四、注意事项
1. **执行顺序**:
从上到下依次判断,首个满足条件的 `WHEN` 被执行后跳出
2. **ELSE 子句**:
- 可省略,默认返回 `NULL`
- 建议始终包含以避免意外空值
3. **数据类型**:
- 所有 `THEN` 结果需类型兼容
- 必要时使用转换函数(如 `TO_CHAR()`)
4. **性能优化**:
- 将高概率条件放在前面
- 避免过度嵌套影响可读性
> **与 COALESCE 对比**:
> `CASE WHEN` 适合复杂条件分支,`COALESCE` 专精空值处理。两者常组合使用:
> ```sql
> SELECT
> COALESCE(
> CASE WHEN status = 'active' THEN modified_date END,
> created_date
> ) AS effective_date
> FROM records;
> ```
---
###
阅读全文
相关推荐


















