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

如何嵌套CASE WHEN实现SQL中空has_overdue_days返回0

SQL逾期天数空值转0的实现方案

空值产生的原因:当没有匹配的逾期记录时,内层CASE WHEN筛选后无符合条件的行,MIN()聚合函数对空集计算会返回NULL,current_date与NULL做算术运算的结果仍为NULL,最终就会返回空值。

嵌套CASE WHEN完整写法

按照要求使用嵌套CASE WHEN逻辑改造后的代码如下:

CASE
    -- 判断是否存在有效逾期记录
    WHEN MIN(
        CASE
            WHEN psi.status = 'OPEN' AND psi.due_date < CURRENT_DATE
            THEN psi.due_date
        END
    ) IS NOT NULL
    -- 存在逾期时计算实际逾期天数
    THEN CURRENT_DATE - MIN(
        CASE
            WHEN psi.status = 'OPEN' AND psi.due_date < CURRENT_DATE
            THEN psi.due_date
        END
    )
    -- 无匹配逾期记录时直接返回0
    ELSE 0
END AS has_overdue_days

逻辑说明

  • 内层CASE WHEN完全保留原有筛选逻辑:仅返回状态为OPEN、到期日早于当前日期的逾期记录到期日,非逾期记录返回空值;经MIN()聚合后,存在逾期记录则返回最早的逾期到期日,无逾期记录则返回NULL
  • 外层CASE WHEN做二次判断:如果聚合得到的最早逾期到期日非空,就执行日期减法算出实际逾期天数;如果聚合结果为NULL(即无匹配逾期记录),直接返回0,不会再出现空值。

如果不强制要求使用嵌套CASE WHEN,也可以用空值处理函数简化写法:COALESCE(current_date - min(case when psi.status = 'OPEN' and psi.due_date < current_date then psi.due_date end), 0) as has_overdue_days,运行效果和嵌套CASE WHEN完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.07 16:15:41