如何删除雪花 sql 中特定特殊字符 (~) 之后的字符串中的字符?
How can I remove characters in a string after a specific special character (~) in snowflake sql?
我正在使用 Snowflake SQL。我想从字符串中删除特殊字符 ~
之后的字符。我该怎么做?
这是整个场景。让我解释。我确实有一个像 'CK#123456~fndkjfgdjkg' 这样的字符串。现在,我只想要#之后的数字。~之后什么都不要。这是数字长度因该字段值而异。它可能是 1 或 5 或 3。我想在 where class 中添加条件,其中此数字等于加入后其他 table 的 check_num。我正在 where 条件下尝试 REGEXP_SUBSTR(A.SRC_TXT, '(?<=CK#)(.+?\b)') = C.CHK_NUM 。我收到错误 'No repititive argument after ?'
您可以为此使用正则表达式
-- 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'
如果您需要在 ~ 之后删除其他特定字符集,您可以使用稍微复杂一些的正则表达式来完成此操作,但我需要您想要的 input/output 示例来帮助完成此操作。
编辑更新问题
这个正则表达式替换应该能满足您的需求。
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
我可能会做类似下面的事情,足够简单但不如 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)));
希望对你有帮助...丰富
看起来前瞻和后视在 REGEXP 函数中 不受 支持,它们似乎在 LIST 命令的 PATTERN 子句中起作用. Snowflake 文档没有提及前瞻或后视的任何一种方式。
在你的例子中:
- 查询引擎似乎正在寻找那个重复的参数,而您正在尝试向后看
- 您没有指定要提取的内容。您有两个捕获组,但在这种情况下,所有内容都会返回
- 既然您希望删除
~
之后的所有内容,您有一个分隔符,为什么不在您的 REGEXP_SUBSTR
函数中使用它呢?
尝试以下操作:
SELECT ,REGEXP_SUBSTR(,'\w+#(.+?)~',1,1,'is',1)
FROM VALUES
('CK#123456~fndkjfgdjkg')
,('QH#128fklj924~fndkjfgdjkg')
;
这寻找:
- 一个或多个单词字符
- 其次是
#
- 捕获一个或多个字符最多 not 包括
~
- Returns 捕获组中的字符
您可以将 .+?
更改为 \d+?
以确保模式仅为数字。 反斜杠必须用反斜杠转义。
可以在此处找到函数每个参数的说明:
https://docs.snowflake.net/manuals/sql-reference/functions/regexp_substr.html
你可以检查一下!!
select substr('CK#123456~fndkjfgdjkg',4,6) 来自 dual;
输出
123456
https://docs.snowflake.net/manuals/sql-reference/functions/substr.html
我正在使用 Snowflake SQL。我想从字符串中删除特殊字符 ~
之后的字符。我该怎么做?
这是整个场景。让我解释。我确实有一个像 'CK#123456~fndkjfgdjkg' 这样的字符串。现在,我只想要#之后的数字。~之后什么都不要。这是数字长度因该字段值而异。它可能是 1 或 5 或 3。我想在 where class 中添加条件,其中此数字等于加入后其他 table 的 check_num。我正在 where 条件下尝试 REGEXP_SUBSTR(A.SRC_TXT, '(?<=CK#)(.+?\b)') = C.CHK_NUM 。我收到错误 'No repititive argument after ?'
您可以为此使用正则表达式
-- 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'
如果您需要在 ~ 之后删除其他特定字符集,您可以使用稍微复杂一些的正则表达式来完成此操作,但我需要您想要的 input/output 示例来帮助完成此操作。
编辑更新问题
这个正则表达式替换应该能满足您的需求。
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
我可能会做类似下面的事情,足够简单但不如 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)));
希望对你有帮助...丰富
看起来前瞻和后视在 REGEXP 函数中 不受 支持,它们似乎在 LIST 命令的 PATTERN 子句中起作用. Snowflake 文档没有提及前瞻或后视的任何一种方式。
在你的例子中:
- 查询引擎似乎正在寻找那个重复的参数,而您正在尝试向后看
- 您没有指定要提取的内容。您有两个捕获组,但在这种情况下,所有内容都会返回
- 既然您希望删除
~
之后的所有内容,您有一个分隔符,为什么不在您的REGEXP_SUBSTR
函数中使用它呢?
尝试以下操作:
SELECT ,REGEXP_SUBSTR(,'\w+#(.+?)~',1,1,'is',1)
FROM VALUES
('CK#123456~fndkjfgdjkg')
,('QH#128fklj924~fndkjfgdjkg')
;
这寻找:
- 一个或多个单词字符
- 其次是
#
- 捕获一个或多个字符最多 not 包括
~
- Returns 捕获组中的字符
您可以将 .+?
更改为 \d+?
以确保模式仅为数字。 反斜杠必须用反斜杠转义。
可以在此处找到函数每个参数的说明: https://docs.snowflake.net/manuals/sql-reference/functions/regexp_substr.html
你可以检查一下!!
select substr('CK#123456~fndkjfgdjkg',4,6) 来自 dual;
输出 123456
https://docs.snowflake.net/manuals/sql-reference/functions/substr.html