sql - 如何在雪花 sql 中的特定特殊字符 (~) 之后删除字符串中的字符?
问题描述
我正在使用雪花 SQL。我想在特殊字符之后从字符串中删除字符~
。我怎样才能做到这一点?
这是整个场景。让我解释。我确实有一个像'CK#123456~fndkjfgdjkg'这样的字符串。现在,我只想要#之后的数字。而不是~之后的任何东西。这是该字段值的数字长度。它可能是 1 或 5 或 3。我想在 where 类中添加条件,其中该数字等于加入后来自其他表的 check_num。我在 where 条件下尝试 REGEXP_SUBSTR(A.SRC_TXT, '(?<=CK#)(.+?\b)') = C.CHK_NUM 。我得到的错误是“之后没有重复的论点?”
解决方案
您可以为此使用正则表达式
-- 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
推荐阅读
- c++ - C++17 向量类如何从参数包中推导出类型?
- php - 如何在 Laravel 的 1 条路线上执行 2 个功能?
- html - 如何使用引导程序将背景拆分为图像后面的 2 种不同颜色
- c++ - 如何访问 C++ 类中的私有数据成员
- shell - KSH 数学运算不返回十进制结果,而是返回 0
- python - Python - 从字符串列表中快速计算文本中的单词并以
- jpa - 如何拦截和修改JPA生成的SQL语句?
- python - 在 Python 中读取用于决策树学习的 CSV 文本文件
- java - 在android 10及更高版本中仅接收一次位置信息时我必须前台服务吗?
- java - 我正在尝试重新创建我在 C++ 中创建的 Java 代码,但不断收到此错误:“未定义对 'Rooms::east' 的引用”