Snowflake环境下SQL剔除含'test'但保留'contest'数据的方法
需求逻辑:剔除所有名称包含'test'(大小写不敏感)的营销活动,但保留名称含'contest'的活动,同时保留既不含'test'也不含'contest'的活动。原写法NAME ILIKE ANY('%_test_%', '%_test%', 'test_%', 'test')会误删含'contest'的数据,因为contest中的test会被错误匹配。
方案一:逻辑组合判断
通过明确的逻辑分支筛选符合条件的数据:
SELECT Name FROM your_table_name WHERE -- 保留含'contest'的记录 REGEXP_LIKE(Name, 'contest', 'i') OR -- 保留既不含'test'也不含'contest'的记录 NOT REGEXP_LIKE(Name, 'test', 'i');
方案二:正则负向预查精准匹配
使用正则负向预查仅匹配独立的'test'(排除'contest'中的'test'),再剔除这些记录:
SELECT Name FROM your_table_name WHERE NOT REGEXP_LIKE(Name, '(?<!con)test', 'i');
关键说明
REGEXP_LIKE的第三个参数'i'表示大小写不敏感匹配,覆盖TEST、Test等所有大小写组合;- 方案二中的
(?<!con)是负向预查规则,意思是匹配'test'时其前面不能是'con',彻底避免误识别'contest'中的'test'; - 两种方案均可满足需求,可根据个人习惯选择。
示例验证
针对给定的示例数据:
| Name |
|AuroraEnterprisesInc_AuroraSepTestCampaign |
|TEST |
|test |
|001_test_XP_GutterDoctor_June-OctoberCampaign|
|FR_TEST |
|002_XP_HunterKnifton_21ElectionContestCampaign|
|001_XP_Kijiji_BuyandSell |
执行上述SQL后,将得到预期结果:
| Name |
|002_XP_HunterKnifton_21ElectionContestCampaign|
|001_XP_Kijiji_BuyandSell |
内容的提问来源于stack exchange,提问作者PiCubed

