【问题标题】:using regexp_replace for replacing special characters in snowflake使用 regexp_replace 替换雪花中的特殊字符
【发布时间】:2021-03-31 08:39:03
【问题描述】:

其中一列有特殊字符,需要用空格替换。 我正在使用 REGEXP_REPLACE,但由于列的排序规则为“en-ci”而引发错误

SQL 命令: select REGEXP_REPLACE(INPUT_STRING, '[+,()]', ' ',1,0) FROM TABLE;

以下是错误: SQL编译错误:error line 1 at position 7 Function REGEXP_REPLACE does not support collation.

您的建议可能会有很大帮助。

谢谢。

【问题讨论】:

    标签: snowflake-cloud-data-platform


    【解决方案1】:

    我确认了使用 en-ci 整理的列不适用于 REGEXP_REPLACE 的行为。我怀疑并确认 Snowflake UDF 中的 JavaScript 正则表达式替换起作用。

    我编写了一组 Snowflake UDF,以使用 JavaScript 的正则表达式尽可能接近 Snowflake 正则表达式函数的语法。这样做的目的是支持前瞻和后瞻,但同样的功能也将支持这个用例。

    您可以在此处获取 UDF:https://github.com/GregPavlik/SnowflakeUDFs/blob/main/Regex.txt

    您可以在此处获得简要文档: https://github.com/GregPavlik/SnowflakeUDFs/blob/main/RegExp2_Functions.pdf

    然后,您可以通过在 Snowflake 正则表达式函数的名称末尾添加“2”来运行您的语句。然后它将使用模拟该函数行为但使用 JavaScript 正则表达式的 UDF:

    select REGEXP_REPLACE2(INPUT_STRING, '[+,()]', ' ',1,0) FROM TABLE;
    

    【讨论】:

    • 感谢您的建议,我已经按照给定的链接创建了 UDF。但它抛出错误。 JavaScript execution error: Uncaught SyntaxError: Invalid flags supplied to RegExp constructor 'g0' in REGEXP_SUBSTR2 at ' var regex = new RegExp(PATTERN, params)' position 16 stackstrace: REGEXP_SUBSTR2 line: 11
    • 你能说明你是如何调用 REGEXP_SUBSTR2 的吗?标志应该是“g”,我正在尝试确定“g0”标志的来源。
    • 这就是我打电话的方式。REGEXP_SUBSTR2('inputstring', '[+,()]', ' ',1,0)
    • 您应该使用 REGEXP_REPLACE2 而不是 REGEXP_SUBSTR2。这有效:选择 regexp_replace2('inputstring', '[+,()]', ' ');
    • 仍然收到错误,当我将输入字符串作为“samplestring”(手动字符串)提供时,它正在工作,但使用列名它不工作。 select REGEXP_REPLACE2(Columnname, '[+,()]', ' ',1,0,'') AS Col1 from table; 下面是错误JavaScript execution error: Uncaught TypeError: Cannot read property 'substring' of undefined in REGEXP_REPLACE2 at ' var skippedString = SUBJECT.substring(0, POSITION - 1);' position 32 stackstrace: REGEXP_REPLACE2 line: 6
    【解决方案2】:

    您只需通过将空字符串传递给 COLLATE 函数的 参数来从列中删除排序规则,就像 COLLATE(COLLATED_COLUMN, '') 这适用于雪花中不支持排序规则的任何正则表达式相关函数:)


    在您的情况下,您应该这样做:
    select REGEXP_REPLACE(COLLATE(INPUT_STRING, ''), '[+,()]', ' ', 1, 0) FROM TABLE

    P.S:这个很难弄清楚,来自秘鲁的问候!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 2021-12-17
      • 2014-11-03
      • 2015-01-16
      • 2019-12-25
      • 2021-07-21
      • 1970-01-01
      相关资源
      最近更新 更多