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

