如何为3个UNION ALL拼接的SQL查询添加AccountStatus可选过滤参数
完全可以实现,有两种常用的实现方式,你可以根据数据量和使用场景选择:
方案1:外层嵌套子查询过滤(写法简单易维护)
把你现有UNION ALL拼接的查询整体作为内联子查询,在外层加可选参数的过滤逻辑即可,适合数据量不大的场景:
SELECT * FROM ( -- 替换为你原本的完整查询逻辑即可 SELECT 'Red Account' AS AccountStatus, 其他字段 FROM 你的业务表 WHERE OverdueDays >= 30 UNION ALL SELECT 'Yellow Account' AS AccountStatus, 其他字段 FROM 你的业务表 WHERE OverdueDays > 10 AND OverdueDays < 30 UNION ALL SELECT 'Green Account' AS AccountStatus, 其他字段 FROM 你的业务表 WHERE OverdueDays <= 10 ) AS AccountStatusResult -- 可选参数过滤逻辑,@InputStatus为你传入的状态参数 WHERE (@InputStatus IS NULL OR @InputStatus = '' OR AccountStatus = @InputStatus)
逻辑说明:参数为空(NULL或空字符串)时返回全部状态的结果,参数有值时仅返回匹配对应AccountStatus的结果
方案2:参数下推到子查询(性能更优)
如果你的业务表数据量很大,可以把过滤逻辑下推到每个子查询中,数据库执行时会直接跳过不符合参数要求的子查询,不需要先生成全量结果再过滤:
SELECT 'Red Account' AS AccountStatus, 其他字段 FROM 你的业务表 WHERE OverdueDays >= 30 AND (@InputStatus IS NULL OR @InputStatus = '' OR @InputStatus = 'Red Account') UNION ALL SELECT 'Yellow Account' AS AccountStatus, 其他字段 FROM 你的业务表 WHERE OverdueDays > 10 AND OverdueDays < 30 AND (@InputStatus IS NULL OR @InputStatus = '' OR @InputStatus = 'Yellow Account') UNION ALL SELECT 'Green Account' AS AccountStatus, 其他字段 FROM 你的业务表 WHERE OverdueDays <= 10 AND (@InputStatus IS NULL OR @InputStatus = '' OR @InputStatus = 'Green Account')
注意:部分数据库不支持10 < OverdueDays < 30的连续比较写法,建议统一改为OverdueDays > 10 AND OverdueDays < 30避免语法错误,参数写法可以根据你使用的数据库调整,比如MySQL中可以用?、:InputStatus等替换@InputStatus
内容的提问来源于stack exchange,提问作者James C
相关产品推荐
相关产品推荐

