Snowflake筛选含数字行方法 regexp_like匹配不生效怎么办
Snowflake 筛选字段包含数字行的实现方案
之前写法失效的核心原因
你之前的正则写法不生效是踩了Snowflake正则函数的两个默认规则坑:
REGEXP_LIKE默认是全字符串匹配,会自动在正则规则首尾加^和$锚定,你写[0-9]、\d只会匹配整列值刚好是单个数字的行,无法匹配长字符串中包含数字的场景。- Snowflake单引号包裹的字符串中,反斜杠
\默认是转义字符,直接写'\d'不会被识别为数字元字符,会被解析为无效的匹配规则。 LIKE仅支持%(任意长度任意字符)、_(单个任意字符)两个通配符,原生不支持数字类的范围匹配,硬写需要拼接10个OR条件(col1 LIKE '%0%' OR col1 LIKE '%1%' ...),冗余且效率差,不推荐使用。
可直接运行的正确写法
写法1:最通用无转义坑版本(推荐)
直接用[0-9]匹配数字,前后加.*匹配任意前后缀,适配所有Snowflake版本,不需要记额外转义规则:
SELECT * FROM b WHERE REGEXP_LIKE(col1, '.*[0-9].*');
写法2:更简洁的子串匹配版本
用Snowflake原生的REGEXP_CONTAINS函数,这个函数本身就是判断字符串中是否存在匹配正则的子串,不需要手动加前后通配符:
SELECT * FROM b WHERE REGEXP_CONTAINS(col1, '[0-9]');
写法3:使用\d元字符的版本
如果习惯用\d代表数字,要注意转义规则,两种写法都可以:
-- 单引号场景下用双反斜杠转义 SELECT * FROM b WHERE REGEXP_CONTAINS(col1, '\\d'); -- 用Snowflake美元定界符包裹字符串,不需要额外转义反斜杠 SELECT * FROM b WHERE REGEXP_CONTAINS(col1, $$\d$$);
结果验证
针对你给出的测试数据集,以上写法会准确返回5条包含数字的记录:
- avr100000
- 20170910020359.761
- adf56ds76gwr
- 0+093000
- 080000
纯文本的adfdsgwr、Enterprise两条记录会被正常过滤,完全符合预期。
内容的提问来源于stack exchange,提问作者Sanjar Sotimboyev
相关产品推荐
相关产品推荐

