You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL中CASE子句多条件设置问题:无法正确返回I2值

SQL CASE语句条件优先级问题

原始数据

Statusbegin_dateend_date
Active2019-12-012020-09-01
Active2019-04-01NULL
Active2019-06-012019-06-09
Inactive2019-05-012020-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 

当前输出

Statusbegin_dateend_dateresult
Active2019-12-012020-09-01E2
Active2019-04-01NULLE2
Active2019-06-012019-06-09X
Inactive2019-05-012020-08-01E2

预期输出

Statusbegin_dateend_dateresult
Active2019-12-012020-09-01E2
Active2019-04-01NULLE2
Active2019-06-012019-06-09X
Inactive2019-05-012020-08-01I2

解决方案

问题根源在于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

这样就能保证:

  1. 所有Inactive的记录直接返回'I2',不受日期条件影响
  2. Active的记录再按日期差或end_date是否为NULL判断返回'E2'或'X'

内容的提问来源于stack exchange,提问作者User277883

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 05:27:50