如何在SELECT语句中用CASE WHEN生成EstimatedAfterProcess计算字段
没问题,我来帮你搞定这个SQL字段的计算需求!
你需要新增的EstimatedAfterProcess字段核心是处理intProcessAfterDays的NULL值情况,下面给你两种常用的写法,适配大多数主流数据库,还会补充不同数据库的细节差异:
方法一:用CASE语句(可读性强,逻辑清晰)
CASE语句可以明确分支判断,适合需要清晰展示逻辑的场景:
SELECT dtmStartProcess, intProcessAfterDays, CASE WHEN intProcessAfterDays IS NOT NULL THEN dtmStartProcess + INTERVAL intProcessAfterDays DAY ELSE dtmStartProcess + INTERVAL 15 DAY END AS EstimatedAfterProcess FROM 你的表名;
这段代码的逻辑很直白:如果intProcessAfterDays不为空,就把它的数值加到dtmStartProcess上;如果是空值,就给日期加15天。
方法二:用COALESCE函数(更简洁)
COALESCE函数的作用是返回参数列表里第一个非NULL的值,用它可以把代码简化很多:
SELECT dtmStartProcess, intProcessAfterDays, dtmStartProcess + INTERVAL COALESCE(intProcessAfterDays, 15) DAY AS EstimatedAfterProcess FROM 你的表名;
这里COALESCE(intProcessAfterDays, 15)会自动取intProcessAfterDays的有效值,没有的话就用15,再和日期相加,效果和CASE完全一样,但代码更短。
不同数据库的语法适配
上面的写法是MySQL、PostgreSQL这类数据库的通用写法,如果你用的是其他数据库,需要调整日期加法的语法:
- SQL Server:要用
DATEADD函数
SELECT dtmStartProcess, intProcessAfterDays, DATEADD(DAY, COALESCE(intProcessAfterDays, 15), dtmStartProcess) AS EstimatedAfterProcess FROM 你的表名;
- Oracle:直接用加号即可,或者用
numtodsinterval确保类型严谨
SELECT dtmStartProcess, intProcessAfterDays, -- 简单写法 dtmStartProcess + COALESCE(intProcessAfterDays, 15) AS EstimatedAfterProcess -- 更严谨的写法(推荐) -- dtmStartProcess + numtodsinterval(COALESCE(intProcessAfterDays, 15), 'DAY') AS EstimatedAfterProcess FROM 你的表名;
你可以根据自己使用的数据库选择对应的写法,替换掉你的表名就能直接用啦!
内容的提问来源于stack exchange,提问作者David Belovezcik
相关产品推荐
相关产品推荐

