存储过程WHERE子句CASE语句适配SSRS全选参数查询方案咨询
问题原因
你原有逻辑在@loc传3(选全部)时,CASE语句没有匹配的判断分支,默认返回NULL。SQL里任何值和NULL做=比较的结果都是UNKNOWN,WHERE子句会把所有行都过滤掉,自然查不到数据。
修复方法
方案1:布尔逻辑写法(推荐,性能最优)
直接用OR拼接筛选条件,这种写法最利于SQL Server查询优化器识别,能正常命中Location字段上的索引,执行效率最高:
WHERE (@loc = 1 AND db.Location = 1) OR (@loc = 2 AND db.Location = 2) OR (@loc = 3 AND db.Location IN (1, 2))
如果确认Location字段永远只有1(内部)、2(外部)两个有效值,没有其他脏数据,还可以简化成一行:
WHERE @loc = 3 OR db.Location = @loc
方案2:保留CASE写法
如果你习惯用CASE实现,只要补全@loc=3的分支,让判断条件在选全部时恒成立即可,不需要嵌套多余的CASE:
WHERE db.Location = CASE WHEN @loc = 1 THEN 1 WHEN @loc = 2 THEN 2 WHEN @loc = 3 THEN db.Location END
补充建议
如果后续报表需要支持多地点组合筛选,不用单独留「全部」的参数值,直接把SSRS参数设置为允许多选,存储过程搭配表值参数或者字符串拆分函数处理参数值即可,扩展性更强。
内容的提问来源于stack exchange,提问作者James Mangan
相关产品推荐
相关产品推荐

