首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Oracle SQL在列中查找子字符串加上2个字符并删除该子字符串

Oracle SQL在列中查找子字符串加上2个字符并删除该子字符串
EN

Stack Overflow用户
提问于 2020-10-26 21:56:48
回答 2查看 72关注 0票数 1

我有一个列,其中包含带有逗号分隔值的初始字符串,例如:

代码语言:javascript
运行
复制
TEST-10=5,TEST-136=6,TEST-3=1,TEST-4=2,TEST-5=3,TEST-9013=100,TEST-9=4

我需要replace或TEST来删除子字符串TEST-136=2,这样我就有了结果字符串:

代码语言:javascript
运行
复制
TEST-10=5,TEST-3=1,TEST-4=2,TEST-5=3,TEST-9013=100,TEST-9=4

下面的SQL只从列字符串中删除TEST-136,而不删除"=6“部分:

代码语言:javascript
运行
复制
UPDATE mytable SET mycolumn = REPLACE(mycolumn, 'TEST-136', '');

此外,如果可能,我甚至希望删除2个或更多我想要的特定子串,这意味着TEST-136=6和TEST-9013=100,因此结果字符串为:

代码语言:javascript
运行
复制
TEST-10=5,TEST-3=1,TEST-4=2,TEST-5=3,TEST-9=4

请注意,TEST-136=6,TEST-9013=100可以位于列串的随机位置,而不是特定的。

此外,TEST-136=6或TEST-9013=100可以位于字符串的末尾,因此在这种情况下,还需要删除删除子字符串后存在的逗号。例如:

代码语言:javascript
运行
复制
TEST-10=5,TEST-3=1,TEST-4=2,TEST-5=3,TEST-9=4,TEST-9013=100

应该变成:

代码语言:javascript
运行
复制
TEST-10=5,TEST-3=1,TEST-4=2,TEST-5=3,TEST-9=4

而不是:

代码语言:javascript
运行
复制
TEST-10=5,TEST-3=1,TEST-4=2,TEST-5=3,TEST-9=4,
EN

回答 2

Stack Overflow用户

发布于 2020-10-26 21:59:00

你只是在找replace()吗?

代码语言:javascript
运行
复制
replace(replace(mycolumn, 'TEST-136=6', ''), 'TEST-9013=100', '')

如果您想要将其泛化:

代码语言:javascript
运行
复制
regexp_replace(mycolumn, '(TEST-136|TEST-9013)=[0-9]*', '', 1, 0)

如果您希望对此进行泛化并删除下一个逗号:

代码语言:javascript
运行
复制
regexp_replace(mycolumn, '(TEST-136|TEST-9013)=[0-9]*,?', '', 1, 0)
票数 1
EN

Stack Overflow用户

发布于 2020-10-26 22:05:54

我将在这里使用正则表达式替换:

代码语言:javascript
运行
复制
SELECT
    col,
    TRIM(BOTH ',' FROM REGEXP_REPLACE(col, ',?TEST-(136|9013)=[0-9]+,?', ',')) AS col_out
FROM yourTable;

这里的正则表达式替换逻辑是查找某些值的TEST-\d+=\d+,以及可选的前导/尾随逗号。然后我们只用一个逗号替换。如果替换目标是CSV字符串中的第一个或最后一个条目,则存在边缘情况。在这种情况下,可能会留下一个前导/尾随逗号。所以我们去掉了这样的逗号。

请注意,这里最好的答案可能是告诉您停止在SQL表中存储CSV。进行这样的字符串操作来更新表是非常昂贵的,并且不是数据库的预期用途。相反,可以考虑将每个CSV值放在单独的行中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64538582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档