如何嵌套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
相关产品推荐
相关产品推荐

