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
相关产品推荐
相关产品推荐

