Snowflake中REGEXP_LIKE匹配SSN格式失效问题求助(Oracle正则兼容)
Snowflake中REGEXP_LIKE匹配SSN格式的问题解决
你的问题源于Snowflake和Oracle使用的正则表达式语法差异:Oracle默认采用Perl兼容正则(PCRE),而Snowflake的REGEXP_LIKE遵循POSIX正则标准,这导致\d这类PCRE专属语法在Snowflake中无法被识别。
修正后的正则表达式
将\d替换为POSIX标准的数字匹配符[0-9](或[:digit:]),即可正常匹配两种SSN格式:
SELECT * FROM customers WHERE REGEXP_LIKE(PER_NUM, '^[0-9]{3}-?[0-9]{2}-?[0-9]{4}$');
或者使用POSIX字符类的写法:
SELECT * FROM customers WHERE REGEXP_LIKE(PER_NUM, '^[:digit:]{3}-?[:digit:]{2}-?[:digit:]{4}$');
优化版本(更清晰区分两种格式)
如果希望更明确地匹配两种独立格式(带连字符的11位和无连字符的9位),可以用分支结构:
SELECT * FROM customers WHERE REGEXP_LIKE(PER_NUM, '^([0-9]{3}-[0-9]{2}-[0-9]{4})$|^([0-9]{9})$');
测试验证
用你的测试数据执行修正后的SQL,会返回以下符合条件的记录:
- account_number: 1589420(PER_NUM: '232-76-1119')
- account_number: 2834123(PER_NUM: '434689191')
- account_number: 4829381(PER_NUM: '223788145')
- account_number: 9821802(PER_NUM: '123-73-3171')
- account_number: 8028387(PER_NUM: '589-78-8239')
而PER_NUM为'1234567890'的10位数字记录会被正确排除,符合预期。
内容的提问来源于stack exchange,提问作者Himanshu Kandpal
相关产品推荐
相关产品推荐

