如何在CASE语句内调用函数取值,基于各函数返回最大值返回对应状态
实现方案
完全可以通过CASE语句实现该需求,根据你当前只有2组流程耗时的场景,有两种常用实现方式:
方式1:直接在CASE中比对(适用于流程少的场景)
直接在CASE的判断分支里比对两个自定义函数的返回值,根据最大值返回对应状态,示例代码如下:
SELECT -- 此处保留你原有查询的其他字段 CASE WHEN dbo.WorkTime(o.imported_date,pkd.create_date) >= dbo.WorkTime(pkd.picked_date, hums.packed_on_date) THEN '入库审核流程耗时最长' ELSE '拣货打包流程耗时最长' END AS max_consume_process_status FROM 你的主表名 o -- 此处保留你原有的表关联逻辑,比如 JOIN pkd ON 关联条件 JOIN hums ON 关联条件
如果存在日期为空导致函数返回NULL的情况,可以用ISNULL(函数返回值, 0)处理,避免判断逻辑异常
方式2:预计算耗时后再判断(扩展性更好,适合后续要新增流程的场景)
如果后续可能新增更多需要统计耗时的流程,可以用CTE或者子查询先把所有流程的耗时计算出来,再进行判断,后续新增流程只需要补充预计算字段和判断分支即可:
WITH process_duration AS ( SELECT -- 此处保留你原有查询的其他字段 dbo.WorkTime(o.imported_date,pkd.create_date) AS import_create_duration, dbo.WorkTime(pkd.picked_date, hums.packed_on_date) AS pick_pack_duration FROM 你的主表名 o -- 此处保留你原有的表关联逻辑 ) SELECT *, CASE WHEN import_create_duration >= pick_pack_duration THEN '入库审核流程耗时最长' ELSE '拣货打包流程耗时最长' END AS max_consume_process_status FROM process_duration
如果后续新增更多流程,你使用的数据库如果支持GREATEST函数(SQL Server 2022及以上版本、MySQL、PostgreSQL等均支持),还可以直接用该函数取多个耗时的最大值,再匹配对应流程即可。
内容的提问来源于stack exchange,提问作者sryaoperations
相关产品推荐
相关产品推荐

