Snowflake cloud data platform 存储过程中的REGEXP_SUBSTR函数返回null

Snowflake cloud data platform 存储过程中的REGEXP_SUBSTR函数返回null,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,我有以下字符串: “AAA | BBB | CCC | 1.23” 我想返回:'CCC|1.23' 使用regexp:\w+\\\\d(.\d+\$)时,我能够获得所需的结果 在Snowflake中运行以下查询时,返回正确的结果: SELECT REGEXP_SUBSTR('AAA|BBB||CCC|1.23', '\\w+\\|\\d(.\\d+|$)') AS regexp_return; 但是,在存储过程中使用时,如下所示: CREATE OR REPLACE PROCEDURE dnr

我有以下字符串:
“AAA | BBB | CCC | 1.23”

我想返回:
'CCC|1.23'

使用regexp:
\w+\\\\d(.\d+\$)
时,我能够获得所需的结果

在Snowflake中运行以下查询时,返回正确的结果:

SELECT REGEXP_SUBSTR('AAA|BBB||CCC|1.23', '\\w+\\|\\d(.\\d+|$)') AS regexp_return;
但是,在存储过程中使用时,如下所示:

CREATE OR REPLACE PROCEDURE dnr.regexp_issue ()
    returns string
    language javascript
    execute as owner
    
    AS
    
    $$
    var sql_statement = `SELECT REGEXP_SUBSTR('AAA|BBB||CCC|1.23', '\\w+\\|\\d(.\\d+|$)') AS regexp_return;`   
    
    var query = snowflake.createStatement({sqlText: sql_statement});
    var query_res = query.execute();
    query_res.next();
    result = query_res.getColumnValue(1);
    
    return result;
    
    $$;
生成的
调用dnr.regexp_issue()
返回一个
NULL
,就好像没有找到匹配的模式一样


有什么想法吗?

斜杠需要双引号,因为它们要经过两个字符串分析器

CREATE OR REPLACE PROCEDURE regexp_issue ()
    returns string
    language javascript
    execute as owner
    
    AS
    
    $$
    var sql_statement = `SELECT REGEXP_SUBSTR('AAA|BBB||CCC|1.23', '\\\\w+\\\\|\\\\d(.\\\\d+|$)') AS regexp_return;`   
    
    var query = snowflake.createStatement({sqlText: sql_statement});
    var query_res = query.execute();
    query_res.next();
    result = query_res.getColumnValue(1);
    
    return result;
    
    $$;
    
call regexp_issue();
给出:

REGEXP_ISSUE
CCC|1.23

要添加到Simeon的答案中,您还可以在带有双反斜杠的字符串末尾使用
。替换(/\\/g,“\\\\”)
。这避免了使用四个反斜杠JavaScript+雪花SQL转义字符。它可以使字符串更清晰。它看起来是这样的:

 var sql_statement = `SELECT REGEXP_SUBSTR('AAA|BBB||CCC|1.23', '\\w+\\|\\d(.\\d+|$)') AS regexp_return;`.replace(/\\/g, "\\\\");
您还可以将其分为两行,以获得更高的清晰度和几微秒的处理时间

var sql_statement = `SELECT REGEXP_SUBSTR('AAA|BBB||CCC|1.23', '\\w+\\|\\d(.\\d+|$)') AS regexp_return;`

sql_statement = sql_statement.replace(/\\/g, "\\\\");

字符串是否不需要双斜杠,或者是否需要双斜杠(我之前在postgresql的shell脚本中有后者),它们需要根据雪花文档进行双斜杠: