【问题标题】:How can I remove characters in a string after a specific special character (~) in snowflake sql?如何在雪花 sql 中的特定特殊字符 (~) 之后删除字符串中的字符?
【发布时间】:2020-04-26 05:09:15
【问题描述】:

我正在使用雪花 SQL。我想从字符串中删除特殊字符~ 之后的字符。我该怎么做?

这是整个场景。让我解释。我确实有一个像'CK#123456~fndkjfgdjkg'这样的字符串。现在,我只想要#之后的数字。而不是~之后的任何东西。这是该字段值的数字长度。它可能是 1 或 5 或 3。我想在 where 类中添加条件,其中该数字等于加入后来自其他表的 check_num。我在 where 条件下尝试 REGEXP_SUBSTR(A.SRC_TXT, '(?

【问题讨论】:

  • 到目前为止你做了什么?可以分享一下代码吗?

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


【解决方案1】:

您可以为此使用正则表达式

-- To remove just the character after a ~
select regexp_replace('fo~o bar','~.', '');
-- returns 'fo bar'

--If you want to keep the ~
select regexp_replace('fo~o bar','~.', '~');
-- returns 'fo~ bar'

--If you want to remove everything after the ~
select regexp_replace('fo~o bar','~.*', '');
--returns 'fo'

如果您需要在 ~ 之后删除其他特定字符集,您可以使用稍微复杂一点的正则表达式来完成此操作,但我需要您所需输入/输出的示例来帮助解决此问题。

编辑更新的问题

这个正则表达式替换应该得到你需要的。

select regexp_replace('CK#123456~fndkjfgdjkg','CK#(\\d*)~.*', '\\1');
-- returns 123456 

(\\d*) 连续获得任意数量的数字,\\1 导致它将匹配项替换为第一组括号中的内容,这是您的数字列表。 CK#~.* 用于确保整个字符串得到匹配和替换。

如果CK# 也可以变化,您可以像这样使用.*?

select regexp_replace('ABCD123HI#123456~fndkjfgdjkg','.*?#(\\d*)~.*', '\\1')
-- returns 123456 

【讨论】:

  • 如果您需要删除所有字符,请在. 之后添加* 以表示零个或多个字符。前任。 > select regexp_replace($1,'~.*', '') from values ('fo~o'),('fo~xyz');
  • 谢谢。这是有效的。但这是整个场景。让我解释。我确实有一个像'CK#123456~fndkjfgdjkg'这样的字符串。现在,我只想要#之后的数字。而不是~之后的任何东西。这是该字段值的数字长度。它可能是 1 或 5 或 3。我想在 where 类中添加条件,其中该数字等于加入后来自其他表的 check_num。我在 where 条件下尝试 REGEXP_SUBSTR(A.SRC_TXT, '(?
  • 您的错误是第一个问号的语法错误。 (? 都是特殊字符,? 在特殊字符后不起作用。 select regexp_replace('CK#123456~fndkjfgdjkg','CK#(\\d*)~.*', '\\1'); 应该给你你需要的。
【解决方案2】:

我可能会做类似以下的事情,很简单,但不像 RegEx 类型的函数那么酷。

set my_string='fooo~12345';
set search_for_me = '~';
SELECT SUBSTR($my_string, 1, DECODE(position($search_for_me, $my_string), 0, length($my_string), position($search_for_me, $my_string)));

我希望这会有所帮助...丰富

【讨论】:

    【解决方案3】:

    看起来前瞻和后瞻在 REGEXP 函数中支持,它们似乎在 LIST 命令的 PATTERN 子句中工作。 Snowflake 文档没有提到前瞻或后视的方式。

    在你的例子中:

    • 查询引擎似乎正在寻找那个重复的参数,而您正在尝试向后看
    • 您尚未指定要提取的内容。您有两个捕获组,但在这种情况下,所有内容都会返回
    • 既然您希望删除 ~ 之后的所有内容,那么您有一个分隔符,为什么不在您的 REGEXP_SUBSTR 函数中使用它?

    尝试以下方法:

    SELECT $1,REGEXP_SUBSTR($1,'\\w+#(.+?)~',1,1,'is',1) 
    FROM VALUES 
    ('CK#123456~fndkjfgdjkg')
    ,('QH#128fklj924~fndkjfgdjkg')
    ;
    

    这寻找:

    • 一个或多个单词字符
    • 后跟#
    • 最多捕获一个或多个字符,包括~
    • 返回捕获组中的字符

    您可以将.+? 更改为\\d+? 以确保模式仅为数字。 反斜杠必须用反斜杠转义。

    函数的每个参数的描述可以在这里找到: https://docs.snowflake.net/manuals/sql-reference/functions/regexp_substr.html

    【讨论】:

      【解决方案4】:

      你可以检查一下!!

      select substr('CK#123456~fndkjfgdjkg',4,6) from dual;

      输出 123456

      https://docs.snowflake.net/manuals/sql-reference/functions/substr.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多