【发布时间】:2021-02-09 16:29:41
【问题描述】:
我正在尝试在 Oracle 中研究如何隔离/突出显示连接字符串中的单词组合,如下所示:
Some words##Again words##More of this||@@@@||Some words##Again words##Other
我们的想法是找到出现恰好出现两次的单词组合并将它们替换为 0,这样我就剩下只出现一次的单词组合,或者在 ||@@@@|| 的左侧或在右侧。查询的结果应该是这样的:
突出显示
Some words##Again words##More of this||@@@@||Some words##Again words##**Other**
替换
0##0##More of this||@@@@||0##0##Other
为您提供有关串联的更多信息:左侧(||@@@@|| 之前)是我当前的客户记录,而右侧是以前的版本。通过进行替换,我可以揭示客户记录之间的任何差异。
我已尝试通过以下方式完成此操作:
-
regexp_replace:这并不完全适用于
REGEXP_REPLACE(MY STRING,'((Some words){1,2})|((Again words){1,2})','0',1,0),因为出于某种原因,我的第一条记录中的字符串部分永远不会被正确替换。由于我需要匹配的单词组合的数量,我也达到了这个功能的限制; - nested CASE WHEN:显然也不起作用,因为 CASE WHEN - 甚至是嵌套的 - 在找到第一个匹配项时停止,但我需要检查并替换所有条件。
- 我曾考虑过使用子选择,但由于此查询使用了我的架构中最大的表之一,因此除非基于每个客户,否则它将无法使用。它可能仍然无法正常工作...
更多信息,以便找到可靠、高效的解决方案:
- 我有 34 个可能的单词组合要匹配
- 我不知道哪些会在那里,除非我很明显地运行查询
- 我不知道它们在连接字符串中的顺序
我希望这很清楚。有人有一些神奇的想法吗?
提前致谢
【问题讨论】:
标签: string oracle regexp-replace