SQL Where子句IN数组失效:000正常WAR无效果求排查建议
解决SQL Where子句筛选参数'WAR'无效的问题
你的问题根源有两个:一是参数名拼写错误(你已标注@Wharehouse应为@Warehouse),二是原Where子句的逻辑分支存在冲突,导致传入'WAR'时预期规则未生效。
原SQL中,当@Wharehouse='WAR'时,第二个分支指定了wd.Whse in ('001','008','RMA'),但第三个分支(@Wharehouse <>'000' AND wd.Whse = @Wharehouse)会同时触发。如果数据中不存在wd.Whse='WAR'的记录,再加上参数名拼写错误导致@Wharehouse实际为NULL(传入的是正确拼写的参数),所有分支都无法匹配,自然无结果返回。
修正后的SQL语句
AND ( -- 传入'000'时,筛选'000'、'REP'仓库,排除ParentWhse为'STR'的记录 (@Warehouse = '000' AND wd.Whse IN ('000','REP') AND wh.ParentWhse <> 'STR') -- 传入'WAR'时,筛选'001'、'008'、'RMA'仓库 OR (@Warehouse = 'WAR' AND wd.Whse IN ('001','008','RMA')) -- 传入其他单个仓库代码时,精确匹配对应仓库 OR (@Warehouse NOT IN ('000','WAR') AND wd.Whse = @Warehouse) )
关键修正点
- 修正参数拼写:将
@Wharehouse改为正确的@Warehouse,确保参数传递匹配。 - 调整分支逻辑:把第三个分支的条件从
@Warehouse <>'000'改为@Warehouse NOT IN ('000','WAR'),避免传入'WAR'时触发无效的精确匹配分支,明确分支的适用场景。
如果想要逻辑更直观,也可以用CASE WHEN重构:
AND ( CASE @Warehouse WHEN '000' THEN CASE WHEN wd.Whse IN ('000','REP') AND wh.ParentWhse <> 'STR' THEN 1 ELSE 0 END WHEN 'WAR' THEN CASE WHEN wd.Whse IN ('001','008','RMA') THEN 1 ELSE 0 END ELSE CASE WHEN wd.Whse = @Warehouse THEN 1 ELSE 0 END END = 1 )
内容的提问来源于stack exchange,提问作者Rick Savoy
相关产品推荐
相关产品推荐

