SQL SELECT语句按条件替换Task_Days_Due列值且不覆盖原值
问题根因
之前写的条件逻辑没有加ELSE分支:SQL里CASE表达式匹配不到任何WHEN条件、又没写ELSE规则时,默认返回NULL,这就是非关闭任务的Task_Days_Due被错误置空的原因。
另外要注意:Task_Days_Due是数值类型,和要替换的提示文本类型不兼容,必须把原数值显式转成字符串,否则部分数据库会抛出类型不匹配的错误。
修正后代码
直接把原来占位的Task_Days_Due, ?????替换成对应的条件逻辑即可,完整代码如下:
SELECT Report_Run_Date, incident_number, INC_Reported_Date, TASK_id, TASK_Assigneee, TASK_Status, -- Staged 1000, Assigned 2000, Pending 3000, Work In Progress 4000, Waiting 5000, Closed 6000, ByPassed 7000 Task_Status2, -- RAG状态列 CASE WHEN Task_Status2 = 'Closed' THEN 'N/A - Task is Closed' WHEN Task_Days_Due <= 0 THEN 'Red' WHEN Task_Days_Due > 0 AND Task_Days_Due <= 7 THEN 'Amber' WHEN Task_Days_Due > 7 THEN 'Green' WHEN Task_Days_Due IS NULL THEN 'No Task End Date' END AS Red_Amber_Green, -- 处理关闭状态下的Task_Days_Due展示 CASE WHEN Task_Status2 = 'Closed' THEN 'N/A - Task is Closed' ELSE CAST(Task_Days_Due AS CHAR) END AS Task_Days_Due FROM 替换为你的实际查询表名
注意事项
- 两处关闭状态的判断统一使用
Task_Status2 = 'Closed'规则,和需求完全对齐;如果你的业务逻辑是通过TASK_Status = 6000判定关闭,直接替换对应判断条件即可,二者逻辑等价。 - 非关闭状态下会走
ELSE分支返回原天数的字符串格式值,不会再出现NULL覆盖的问题。 - 类型转换语法可根据你用的数据库调整:
- MySQL/OceanBase:保持
CAST(Task_Days_Due AS CHAR)即可 - SQL Server:替换为
CAST(Task_Days_Due AS VARCHAR(20)) - PostgreSQL:可简写为
Task_Days_Due::TEXT
- MySQL/OceanBase:保持
内容的提问来源于stack exchange,提问作者Peter Lucas
相关产品推荐
相关产品推荐

