Snowflake存储过程正则特殊字符失效问题求助
问题解决:Snowflake JS存储过程中RLIKE正则匹配失效
问题描述
验证手机号是否符合(XXX) XXX-XXXX格式时,单独执行以下SQL语句能正常返回TRUE:
select RLIKE( '(800) 456-7891', '\\([0-9]{3}\\) [0-9]{3}-[0-9]{4}');
但将该逻辑写入Snowflake JavaScript存储过程后,执行生成的表中FLAG字段始终为FALSE,特殊字符(未被正确识别,添加单个额外反斜杠也无效。
原因分析
JavaScript的模板字符串(用反引号`包裹)会对反斜杠进行一次转义处理。原存储过程中的\\(会被JS解析为\(,传到Snowflake执行时,正则表达式里的(就失去了转义效果,变成了正则的分组符号而非普通字符,导致匹配失败。
解决方法
需要对正则中的反斜杠进行双重转义,也就是使用四个反斜杠\\\\来表示正则里的一个转义反斜杠。修改后的存储过程代码如下:
CREATE OR REPLACE PROCEDURE "SP_TEST"() RETURNS VARCHAR(16777216) LANGUAGE JAVASCRIPT EXECUTE AS OWNER AS $$ var create_cmd_0 = ` CREATE OR REPLACE TABLE QA_TEST_SP_DEBUG AS select '(800) 456-7891' AS PHONE_NUMBER, RLIKE('(800) 456-7891','\\\\([0-9]{3}\\\\) [0-9]{3}-[0-9]{4}') AS FLAG ;` var sql_create_0 = snowflake.createStatement({sqlText: create_cmd_0}); var create_result_0 = sql_create_0.execute(); return 'SUCCESS'; $$ ;
执行修改后的存储过程后,查询QA_TEST_SP_DEBUG表,FLAG字段会正确返回TRUE。
内容的提问来源于stack exchange,提问作者N R
相关产品推荐
相关产品推荐

