如何在SQL WHERE子句中使用CASE语句实现Crystal Report筛选逻辑
原逻辑说明
你提供的Crystal Report筛选条件的核心逻辑为:当BeginCompany不等于0且EndCompany不等于999时,仅保留Company落在两个参数区间内的记录,否则跳过公司维度的筛选,返回所有公司的记录。
等效SQL实现
写法1:CASE语句实现(符合你的需求)
直接在数据集SQL的WHERE子句中添加如下判断即可:
WHERE 1 = CASE WHEN BeginCompany <> 0 AND EndCompany <> 999 THEN CASE WHEN Company BETWEEN BeginCompany AND EndCompany THEN 1 ELSE 0 END ELSE 1 END -- 此处可以拼接你原有的其他筛选条件
逻辑说明:当满足参数区间生效的条件时,只有Company落在区间内才会返回1匹配1=1的判断;否则CASE直接返回1,永远满足条件,和原逻辑的1=1完全等效。
写法2:布尔逻辑实现(更推荐,性能更优)
大部分数据库的优化器对布尔逻辑的执行优化效果优于嵌套CASE语句,生产环境更推荐使用如下等价写法:
WHERE ( (BeginCompany <> 0 AND EndCompany <> 999 AND Company BETWEEN BeginCompany AND EndCompany) OR (BeginCompany = 0 OR EndCompany = 999) ) -- 此处可以拼接你原有的其他筛选条件
注意事项
- 如果
BeginCompany、EndCompany两个参数允许为空,需要补充NULL值判断,例如把BeginCompany <> 0调整为COALESCE(BeginCompany, 0) <> 0,避免NULL值导致判断失效。 - SSRS参数配置时,可以把
BeginCompany默认值设为0、EndCompany默认值设为999,即可实现默认查询全量公司数据的效果。
内容的提问来源于stack exchange,提问作者Patman
相关产品推荐
相关产品推荐

