You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 08:40:29