-1

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

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

4

4 回答 4

3

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

-- 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 
于 2020-01-08T16:12:39.663 回答
0

我可能会做类似以下的事情,很简单,但不像 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)));

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

于 2020-01-08T16:30:19.270 回答
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

于 2020-01-08T21:29:57.880 回答
0

你可以检查这个!

从对偶中选择 substr('CK#123456~fndkjfgdjkg',4,6);

输出 123456

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

于 2020-01-24T09:52:25.587 回答