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

SQL WHERE子句中使用CASE语句按条件过滤SEMI_GV字段问题

解决方案

你要的过滤逻辑不需要嵌套CASE实现,直接用逻辑条件组合的写法可读性和性能更好,也能解决NULL值匹配的问题:

WHERE 
    procur.POSITION = 'BC'
    AND (
        -- 规则1:Description包含semi时,仅返回SEMI_GV为SEMI的行
        (IC.[Description] LIKE '%semi%' AND procur.SEMI_GV = 'SEMI')
        OR 
        -- 规则2:Description不包含semi时,返回SEMI_GV为NULL或者不等于SEMI的行
        (IC.[Description] NOT LIKE '%semi%' AND (procur.SEMI_GV IS NULL OR procur.SEMI_GV <> 'SEMI'))
    )

提示:如果你的数据库大小写敏感,可将IC.[Description] LIKE '%semi%'替换为LOWER(IC.[Description]) LIKE '%semi%',确保大小写的semi都能被匹配到。

如果必须使用CASE语句实现,可以用CASE返回判断标识的写法,规避LIKE无法匹配NULL的问题:

WHERE 
    procur.POSITION = 'BC'
    AND 1 = CASE 
        WHEN IC.[Description] LIKE '%semi%' THEN CASE WHEN procur.SEMI_GV = 'SEMI' THEN 1 ELSE 0 END
        ELSE CASE WHEN procur.SEMI_GV IS NULL OR procur.SEMI_GV <> 'SEMI' THEN 1 ELSE 0 END
    END

你之前的写法问题在于:procur.SEMI_GV LIKE CASE ...的结构天生无法处理SEMI_GV为NULL的场景,因为NULL LIKE 任意字符串的返回结果都是UNKNOWN,不会被WHERE条件判定为有效行,所以不适合用这个结构实现你的需求。

内容的提问来源于stack exchange,提问作者Martin Nejezchleba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:36:03