【问题标题】:Snowflake removing backslashes during Procedure compilation?在程序编译期间雪花去除反斜杠?
【发布时间】:2021-11-27 18:37:45
【问题描述】:

由于某种原因,Snowflake 正在从我的正则表达式函数中删除反斜杠,但仅当我在创建 Javascript 过程时将函数放在“$$”之间时。

这里是我的正则表达式函数:

CREATE OR REPLACE FUNCTION "REGEX_REPLACE_ME"("SUBJECT" VARCHAR(16777216), "PATTERN" VARCHAR(16777216), "REPLACEMENT" VARCHAR(16777216))
RETURNS VARCHAR(16777216)
LANGUAGE JAVASCRIPT
AS '
  
    const p = SUBJECT;
    let regex = new RegExp(PATTERN, ''i'') 
    return p.replace(regex, REPLACEMENT);
  ';

当我简单地在 SQL 中运行它时,它可以工作;它会将“APPLE.com”更改为“APPLE”。

SELECT REXP_REPLACE_ME('APPLE.COM','\\.[A-Z]{2,3}',' ') -- the regex pattern \\.[A-Z]{2,3} is meant to remove domains i.e. ".com",".org", etc.. 

但是,当我在存储过程的 $$ 中运行它时,它会从我的正则表达式模式中删除反斜杠,从而完全改变正则表达式模式。

我的正则表达式从 \\.[A-Z]{2,3} 更改为 -> .[A-Z]{2,3}

CREATE or replace PROCEDURE TESTING_FUNC_1_THIS_CAN_BE_DELETED()
RETURNS VARCHAR
LANGUAGE javascript
AS
$$

var rs = snowflake.execute( { sqlText:
`
    CREATE OR REPLACE VIEW Database.Schema.Table AS

    SELECT REXP_REPLACE_ME('APPLE.COM','\\.[A-Z]{2,3}',' ')  as column_cleaned
 --   ,REXP_REPLACE_ME_WTF('APPLE.COM','\\.[A-Z]{2,3}',' ') AS WHAT_PATTERN_IS_BEING_OUTPUTTED -- function logic in code block below
    
`
                            } );
  $$;

call TESTING_FUNC_1_THIS_CAN_BE_DELETED();

select * from Database.Schema.Table

在这里挠头,我创建了这个函数来显示它输出的模式,这就是我得出结论的方式(我在这里可能是错的......)当 Snowflake 编译时它正在删除反斜杠......

CREATE OR REPLACE FUNCTION "REXP_REPLACE_ME_WTF"("SUBJECT" VARCHAR(16777216), "PATTERN" VARCHAR(16777216), "REPLACEMENT" VARCHAR(16777216))
RETURNS VARCHAR(16777216)
LANGUAGE JAVASCRIPT
AS '
  
    const p = SUBJECT;
    let regex = new RegExp(PATTERN, ''i'');
    //return p.replace(regex, REPLACEMENT);
    return PATTERN;
  ';

有什么想法吗?

【问题讨论】:

    标签: javascript sql snowflake-cloud-data-platform


    【解决方案1】:

    Snowflake SQL 使用 \ 作为转义字符,因此要在 Snowflake SQL 中表示反斜杠,您必须使用 \\

    JavaScript 也使用 \ 作为转义字符,因此要在 JavaScript 中表示反斜杠,您还必须使用 \\

    如果要通过 JavaScript 在 Snowflake SQL 中表示单个反斜杠,则必须发送 2 x 2 = 4 个反斜杠 \\\\

    【讨论】:

      【解决方案2】:

      可能与转义字符等有关

      尝试将您的 SQL 语句用反引号而不是单引号括起来:``

      【讨论】:

      • 嗯,我相信我在示例中使用了反引号?
      • 对不起,你确实是。没发现他们!仍然认为这与它们被识别为转义字符有关
      • 同意,奇怪的是它们完全消失了。
      猜你喜欢
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 2016-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      相关资源
      最近更新 更多