Snowflake SQL中LIKE ESCAPE如何组合转义下划线与通配符匹配指定编码
问题原因
你之前写的LIKE语句不生效,核心是两个问题:
- 对ESCAPE转义规则和LIKE通配符的匹配逻辑理解有偏差:转义符
^仅会转义紧跟在它后面的第一个字符,剩余的_都是单字符通配符;且_通配符可以匹配任意字符,包括下划线本身,加上开头的%是任意长度通配符,会出现匹配位置错位,无法精准卡住第二个下划线后的分段长度。 - 标准SQL的LIKE语法没有“排除指定字符”的匹配能力,无法保证两个下划线之间的分段不含额外下划线,天然不适合这种按下划线分段、校验指定段长度的场景,硬写的话依赖特定数据库的扩展语法,通用性极差。
推荐方案:用RLIKE正则匹配
这是最稳妥、可读性最高、跨引擎兼容性最好的实现方式,逻辑完全贴合需求,不会出现匹配错位:
-- 匹配规则:第二个下划线后恰好3个英文字母,且编码以_QUATRO结尾 CASE WHEN code RLIKE '^[^_]+_[^_]+_[a-zA-Z]{3}_.*_QUATRO$' THEN 1 ELSE 0 END
正则分段解释:
^:匹配字符串起始位置,避免前置内容错位[^_]+_:匹配第一个分段+第一个下划线,[^_]+代表1个及以上非下划线字符[^_]+_:匹配第二个分段+第二个下划线,精准定位到待校验片段的起点[a-zA-Z]{3}:恰好匹配3个英文字母,符合你要求的“3个字母”规则;如果不需要校验字符类型,仅要求3个非下划线字符,替换为[^_]{3}即可_:匹配第三个下划线,保证3个字母后立刻接下一个分段,不会出现多字符的情况.*_QUATRO$:匹配后续任意分段,且字符串以_QUATRO结尾,和你原本的匹配范围一致
用你给的3条样例测试:
- 前两条第二个下划线后是
ITA,恰好3个字母,正常匹配 - 第三条第二个下划线后是
WCPE,共4个字符,会被直接排除,完全符合需求。
内容的提问来源于stack exchange,提问作者RandyMcKay
相关产品推荐
相关产品推荐

