Snowflake中regexp_instr失效,求无需该函数的CASE语句实现方案
无需regexp_instr实现指定字段赋值逻辑
需求说明
当Col1满足以下所有条件时,Col2赋值为ENTERPRISE,否则赋值为NON_ENTERPRISE:
- 非空(不为NULL且不是空/空白字符串)
- 包含"SALES"(不区分大小写)
- 不包含"SALES_INTERNAL"(不区分大小写)
原代码问题
你提供的使用regexp_instr的CASE语句存在逻辑错误,导致无法覆盖所有场景:
CASE WHEN nvl (TABLE."Col1",'NA') <> '' THEN CASE WHEN regexp_instr (UPPER (TABLE."Col1"), 'SALES') = '0' THEN 'ENTERPRISE' WHEN regexp_instr (UPPER (TABLE."Col1"), 'SALES_INTERNAL') <> '0' THEN 'ENTERPRISE' ELSE 'NON_ENTERPRISE' END END AS Col2
比如原代码中,当Col1不包含"SALES"时反而返回ENTERPRISE,这和需求完全相悖,且嵌套CASE的写法也容易导致逻辑混乱。
无需regexp_instr的实现方案
可以用LIKE操作符结合UPPER、NVL、TRIM来实现,逻辑更清晰且不需要正则函数:
CASE -- 同时满足三个核心条件 WHEN TRIM(NVL(TABLE."Col1", '')) <> '' AND UPPER(TABLE."Col1") LIKE '%SALES%' AND UPPER(TABLE."Col1") NOT LIKE '%SALES_INTERNAL%' THEN 'ENTERPRISE' -- 其他所有情况统一返回NON_ENTERPRISE ELSE 'NON_ENTERPRISE' END AS Col2
逻辑解释
TRIM(NVL(TABLE."Col1", '')) <> '':先把NULL转为空字符串,再去掉首尾空格,确保Col1不是NULL、空字符串或全空格的无效值UPPER(TABLE."Col1") LIKE '%SALES%':统一转为大写后,匹配任意位置包含"SALES"的内容,实现不区分大小写的包含判断UPPER(TABLE."Col1") NOT LIKE '%SALES_INTERNAL%':确保内容中不包含"SALES_INTERNAL",同样不区分大小写
内容的提问来源于stack exchange,提问作者Shruti
相关产品推荐
相关产品推荐

