如何在雪花SQL中删除特定特殊字符(〜)之后的字符串中的字符?

时间:2020-01-08 16:04:53

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

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

这是整个场景。让我解释。我确实有一个类似“ CK#123456〜fndkjfgdjkg”的字符串。现在,我只想要#之后的数字,而〜之后什么也不要。该数字长度因该字段值而异。它可能是1或5或3。并且我想在连接后在其中该数字等于来自其他表的check_num的类中添加条件。我在哪里条件下尝试REGEXP_SUBSTR(A.SRC_TXT,'(?<= CK#)(。+?\ b)')= C.CHK_NUM。我收到的错误信息是“之后是否没有重复的论点?”

4 个答案:

答案 0 :(得分:2)

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

-- 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 

答案 1 :(得分:1)

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

G3

我希望这对您有帮助...丰富

答案 2 :(得分:0)

在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

答案 3 :(得分:0)

您可以检查一下!

从double中选择substr('CK#123456〜fndkjfgdjkg',4,6);

输出 123456

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