首页 > 解决方案 > 如何在雪花 sql 中的特定特殊字符 (~) 之后删除字符串中的字符?

问题描述

我正在使用雪花 SQL。我想在特殊字符之后从字符串中删除字符~。我怎样才能做到这一点?

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

标签: sqlsnowflake-cloud-data-platformsnowflake-schema

解决方案


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

-- 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#and是~.*为了确保整个字符串得到匹配和替换。

如果CK#can 也不同,您可以.*?像这样使用。

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

推荐阅读