带有特殊字符的雪花存储过程不起作用

问题描述 投票:0回答:1

我想确定电话号码的格式是否正确。例如格式。 (XXX) XXX-XXXX

这是运行良好的 sql

 select RLIKE(  '(800) 456-7891', '\\([0-9]{3}\\) [0-9]{3}-[0-9]{4}' ) ;

但是当试图在存储过程中复制这个函数时,我无法得到想要的结果

这里是存储过程代码:

  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 时,我看到此记录为 false。一些字符 '(' 是如何被忽略的。我如何让存储过程将其视为普通字符。

我添加了另一个反斜杠,但仍然没有用。

感谢您对此的快速帮助。

stored-procedures snowflake-cloud-data-platform special-characters rlike
1个回答
0
投票

当您将 SQL 查询包装到 JavaScript 时,它会将反斜杠解释为转义字符。因此,这部分

\\([0-9]{3}\\
被翻译成
\([0-9]{3}\
这使得你的正则表达式不同。

为了保持您的正则表达式逻辑,只需在创建存储过程时添加另一对反斜杠,例如:

select '(800) 456-7891' AS PHONE_NUMBER,  RLIKE('(800) 456-7891','\\\\([0-9]{3}\\\\) [0-9]{3}-[0-9]{4}') AS FLAG
© www.soinside.com 2019 - 2024. All rights reserved.