SQL中CASE子句多条件设置问题:无法正确返回I2值
SQL CASE语句条件优先级问题
原始数据
| Status | begin_date | end_date |
|---|---|---|
| Active | 2019-12-01 | 2020-09-01 |
| Active | 2019-04-01 | NULL |
| Active | 2019-06-01 | 2019-06-09 |
| Inactive | 2019-05-01 | 2020-08-01 |
Result列规则
- 当
status为Inactive时,返回'I2' - 当
begin_date与end_date的日期差大于14天,或end_date为NULL时,返回'E2' - 当
begin_date与end_date的日期差小于等于14天时,返回'X'
问题描述
我编写了CASE语句实现'E2'和'X'的逻辑,但当status为Inactive时无法返回'I2',而是输出'E2'。如何在同一个CASE语句中调整条件实现预期结果?
我的代码:
CASE WHEN DATEDIFF (day, begin_date, end_date) > 14 THEN 'E2' WHEN end_date IS NULL THEN 'E2' WHEN DATEDIFF (day, begin_date, end_date) > 14 AND end_date IS NULL AND status = 'Inactive' THEN 'I2' ELSE 'X' END AS Result
当前输出
| Status | begin_date | end_date | result |
|---|---|---|---|
| Active | 2019-12-01 | 2020-09-01 | E2 |
| Active | 2019-04-01 | NULL | E2 |
| Active | 2019-06-01 | 2019-06-09 | X |
| Inactive | 2019-05-01 | 2020-08-01 | E2 |
预期输出
| Status | begin_date | end_date | result |
|---|---|---|---|
| Active | 2019-12-01 | 2020-09-01 | E2 |
| Active | 2019-04-01 | NULL | E2 |
| Active | 2019-06-01 | 2019-06-09 | X |
| Inactive | 2019-05-01 | 2020-08-01 | I2 |
解决方案
问题根源在于CASE语句的条件匹配顺序:CASE是从上到下匹配第一个满足的条件,你之前把Inactive的条件放在了后面,而那条Inactive的记录已经先满足了DATEDIFF(day, begin_date, end_date) >14的条件,因此直接返回'E2',不会走到Inactive的判断分支。
调整条件优先级,把status = 'Inactive'放在最前面,再处理Active的情况:
CASE WHEN status = 'Inactive' THEN 'I2' WHEN DATEDIFF(day, begin_date, end_date) > 14 OR end_date IS NULL THEN 'E2' ELSE 'X' END AS Result
这样就能保证:
- 所有Inactive的记录直接返回'I2',不受日期条件影响
- Active的记录再按日期差或end_date是否为NULL判断返回'E2'或'X'
内容的提问来源于stack exchange,提问作者User277883
相关产品推荐
相关产品推荐

