SQL Server 2017中如何基于两个查询结果执行逻辑AND操作并返回指定结果
解决方案:SQL Server 2017 流程执行与队列状态判断
针对你需要的判断逻辑,我整理了一个直接可用的SQL查询,能精准返回你要的结果(满足条件返回1,其他情况返回0)。核心思路是把两个统计条件整合到一个查询中,通过CASE语句完成逻辑判断:
SELECT CASE WHEN workflow_count <= 0 AND message_count > 0 THEN 1 ELSE 0 END AS result FROM ( -- 统计指定流程最近5分钟的执行记录数 SELECT COUNT(*) AS workflow_count FROM MY_TABLE WHERE [PROCESS] = 'A' AND [DATE] > DATEADD(MINUTE, -5, GETDATE()) ) workflow_stats CROSS JOIN ( -- 统计两个队列的总消息数 SELECT SUM(total) AS message_count FROM ( SELECT COUNT(*) total FROM [dbo].[QUEUE1] UNION ALL SELECT COUNT(*) total FROM [dbo].[QUEUE2] ) queue_stats ) combined_queue;
代码说明:
- 流程统计部分:子查询
workflow_stats负责拉取流程'A'在最近5分钟内的执行次数,用DATEADD(MINUTE, -5, GETDATE())计算当前时间往前推5分钟的阈值,确保只统计指定时间范围内的记录。 - 队列统计部分:子查询
combined_queue通过UNION ALL合并两个队列的记录数(用UNION ALL而非UNION,因为不需要去重,两个队列的消息是独立的),再用SUM得到总消息数。 - 逻辑判断:通过
CROSS JOIN把两个统计结果合并,最后用CASE WHEN检查是否同时满足「无流程执行记录」和「队列有消息」的条件,满足则返回1,否则返回0。
如果需要更灵活的复用(比如随时修改流程名称或时间范围),可以用带参数的版本:
-- 带参数的可复用版本 DECLARE @TargetProcess VARCHAR(50) = 'A'; DECLARE @TimeWindowMinutes INT = 5; SELECT CASE WHEN workflow_count <= 0 AND message_count > 0 THEN 1 ELSE 0 END AS result FROM ( SELECT COUNT(*) AS workflow_count FROM MY_TABLE WHERE [PROCESS] = @TargetProcess AND [DATE] > DATEADD(MINUTE, -@TimeWindowMinutes, GETDATE()) ) workflow_stats CROSS JOIN ( SELECT SUM(total) AS message_count FROM ( SELECT COUNT(*) total FROM [dbo].[QUEUE1] UNION ALL SELECT COUNT(*) total FROM [dbo].[QUEUE2] ) queue_stats ) combined_queue;
这个版本只需要修改开头的参数值,就能快速适配不同的流程和时间范围,不用改动核心逻辑。
内容的提问来源于stack exchange,提问作者Bruno Campiol
相关产品推荐
相关产品推荐

