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

Snowflake中带通配符的CASE WHEN返回错误值问题排查

问题分析与解决

核心问题1:CASE WHEN的匹配优先级

CASE WHEN是从上到下依次匹配的,只要第一个满足条件的分支被触发,就会直接返回对应结果,不会继续检查后续分支。你的NAME值D119992_A64938_email_SUBMIT_kjsdfhksuere8rw987r9_B_Send1里同时包含_A_和_B_,第一个分支when NAME like '%_A_%'先匹配成功,所以直接返回了Control,后面的_B_分支根本不会执行。

核心问题2:LIKE中的下划线是通配符

SQL里LIKE语句的_是匹配任意单个字符的通配符,不是字面意义的下划线。你本来想匹配包含_A_(下划线+A+下划线)的字符串,但实际这个条件会匹配任何中间有A、且A前后各有任意一个字符的字符串,比如XA Y也会被匹配到,这和你预期的逻辑不符。

修复方案

方案1:调整CASE WHEN顺序+转义下划线

把_B_的判断放在前面,同时转义下划线以匹配字面字符:

Select
NAME,
case
when NAME like '%\_B\_%' escape '\' then 'Test'
when NAME like '%\_A\_%' escape '\' then 'Control'
else 'N/A'
end as CELL
from table1

注:不同数据库转义符可能不同,比如SQL Server可改用%[_]A[_]%,Oracle需指定自定义转义字符,根据你的数据库调整即可。

方案2:用字符定位函数替代LIKE

直接判断子字符串是否存在,避免通配符歧义:

Select
NAME,
case
when CHARINDEX('_B_', NAME) > 0 then 'Test'
when CHARINDEX('_A_', NAME) > 0 then 'Control'
else 'N/A'
end as CELL
from table1

注:MySQL用LOCATE,Oracle用INSTR,不同数据库对应函数略有差异。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:00:46