需要解析冒号分隔的字符串,如果在plsql中找到匹配的则去掉部分字符串

Posted

技术标签:

【中文标题】需要解析冒号分隔的字符串,如果在plsql中找到匹配的则去掉部分字符串【英文标题】:Need to parse the string separated by colon and eliminate part of the string if found the match in plsql 【发布时间】:2013-07-26 11:21:08 【问题描述】:

我知道这个话题被讨论过多次,我查看了多个帖子和答案,但找不到我需要做的确切内容。

我正在尝试搜索具有多个 varchar2 值的字符串,以 ':' 分隔,如果在另一个字符串上找到匹配项,则删除匹配的部分字符串,并使用其余部分更新表字符串。

我使用 str 和 instr 函数的组合编写代码,但正在寻找更优雅的解决方案,使用正则表达式或集合。

例如,输入字符串如下所示:('abc:defg:klmnp)。例如,需要找到字符串的一部分(可以在任何位置)并将其删除,结果将如下所示:(abc:klmnp)?

编辑 - 从评论中复制: 输入字符串 (abc:defg:klmn:defgb)。假设我正在寻找 defg,只有 defg 必须被删除,而不是 defgb。现在,就像我之前提到的,下一次,我可能正在寻找位置 1 或最后一个位置的值。因此,要删除的字符串的所需部分可能并不总是从两侧包裹在“:”中,而是取决于它在字符串中的位置,或者从右侧,从左侧,或者从两侧。

【问题讨论】:

我确实希望 lolons 仍然存在,就像我发布的那样:('abc:klnp)。所以字符串的一部分用分隔该值的冒号删除。谢谢 【参考方案1】:

您可以结合使用 LIKE、REPLACE 和 TRIM 函数。

select trim(':' from 
            replace(':'||your_column||':',':'||search_string||':',':')
           ) from table_name
 where ':'||your_column||':' like '%:'||search_string||':%';

想法是,

用冒号包围列并使用 LIKE 函数查找匹配项。 在此类匹配的行上,使用 REPLACE 将搜索字符串以及周围的冒号替换为单个冒号。 然后使用 TRIM 删除周围的冒号。

sqlfiddle的演示

【讨论】:

将换行冒号添加到要查找的值中,即使它是第一个或最后一个也是整洁的。然后在最后将它们移除以进行清理 - 太好了。我看到的唯一一件事是您需要调整 where 子句以查找它何时位于开头或结尾,因为我认为它只会找到它已经包含冒号的位置。 我在 where 子句中用冒号包裹了列。 where ':'||your_column||':' like。所以,它甚至应该在开始或结束时工作。 哦,是的,我现在明白了。抱歉,是我的错。不错的解决方案!【参考方案2】:

编辑(简化)也许这就是你需要的:

SELECT REGEXP_REPLACE(REPLACE('abc:defg:klmnop', ':defg:', ':'), '(^defg:|:defg$)', '')
     , REGEXP_REPLACE(REPLACE('defg:klmnop:abc', ':defg:', ':'), '(^defg:|:defg$)', '')
     , REGEXP_REPLACE(REPLACE('abc:klmnop:defg', ':defg:', ':'), '(^defg:|:defg$)', '')
     , REGEXP_REPLACE(REPLACE('abc:klmnop:defgb:defg', ':defg:', ':'), '(^defg:|:defg$)', '')
  FROM DUAL
;

从 start、middle 和 end 中删除 defg,并忽略 defgb,给出:

abc:klmnop klmnop:abc abc:klmnop abc:klmnop:defgb

要更新表格,您可以:

UPDATE my_table
   SET value = REGEXP_REPLACE(REGEXP_REPLACE(value, ':defg:', ':'), '(^defg:|:defg$)', '')
--  WHERE REGEXP_LIKE(value, '(^|.*:)defg(:.*|$)')
  WHERE value LIKE '%defg%'
;

(尽管可能需要调整 where 的最终正则表达式以匹配,但很难测试...)

【讨论】:

谢谢,但首先我必须找到那个字符串。如果找到,则将其替换为空。如果我要查找的值是最后一个值,并且最后没有列,会发生什么? 而且逻辑上有更大的缺陷。如果我有值 defg 和 defgb 会发生什么,但我只需要删除 defg,而不需要删除另一个 我们不用担心更新表格。我总是可以将替换的值分配给一个变量,然后进行更新 好的。让我更具体一点。 好的。 AngelWarrior 非常感谢您的帮助,让我说得更具体一点。输入字符串 (abc:defg:klmn:defgb)。假设我正在寻找 defg,只有 defg 必须被删除,而不是 defgb。现在,就像我之前提到的,下一次,我可能会寻找位置 1 或最后一个位置的值。因此,要删除的字符串的所需部分可能并不总是从两侧包裹在“:”中,而是取决于它在字符串中的位置,或者从右侧,从左侧,或者从两侧。当然我没有看到你的最新评论

以上是关于需要解析冒号分隔的字符串,如果在plsql中找到匹配的则去掉部分字符串的主要内容,如果未能解决你的问题,请参考以下文章

oracle中PLSQL存储过程中如何使用逗号分隔的集合(逗号分隔字符串转换为一个集合)

无法解析ISO 8601格式的字符串,缺少冒号的冒号,到Java 8 Date

shell 解析json字符串

shell 解析json字符串

shell 解析json字符串

shell 解析json字符串