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