【问题标题】:Sql to select and extract 10 characters before and 10 characters after a substring in Oracle ClobSql在Oracle Clob中选择和提取子字符串之前的10个字符和之后的10个字符
【发布时间】:2017-11-29 17:46:06
【问题描述】:

让我们考虑下面的文本示例:

Lorem Ipsum 只是印刷和排版行业的虚拟文本。 Lorem Ipsum 一直是业界标准的虚拟文本 自 1500 年代以来,当一位不知名的印刷商采用了一种类型的厨房和 争先恐后地制作了一本类型样本书。它不仅活了下来 五个世纪,也是电子排版的飞跃, 基本保持不变。它在 1960 年代流行于 发布包含 Lorem Ipsum 段落的 Letraset 表,以及 最近使用 Aldus PageMaker 等桌面排版软件 包括 Lorem Ipsum 的版本。

如何在子字符串之前提取 10 个字符和在子字符串之后提取 10 个字符,比如说 Oracle 中上述段落中的“Lorem Ipsum”?数据类型是 clob。我一直在尝试使用 SUBSTR 等 Oracle 函数,但到目前为止还没有运气。感谢大家的帮助。

【问题讨论】:

  • 所以你想要industry. Lorem Ipsum has been 在你的输出中?
  • 您需要它来处理给定字符串的每次出现,还是只处理第一次或第 n 次出现?如果给定字符串的出现没有前面/尾随字符会发生什么?
  • 期望的输出是什么 - 两个新列(在输出中),一个显示前面的十个字符,另一个显示后面的十个字符?那么:如果 Lorem Ipsum 就在字符串的开头,则“之前的十个字符”显示 NULL?如果从字符串的开头到 Lorem Ipsum 正好有六个字符怎么办?那么:如果 Lorem Ipsum 在文本中出现多次怎么办?例如:字符串'Lorem Ipsum wins. Lorem Ipsum.'的期望输出是什么?

标签: sql oracle oracle11g oracle-sqldeveloper oracle12c


【解决方案1】:

您可以将regexp_replace 与反向引用一起使用:

select 
    regexp_replace(col, '.*?(.{0,10}Lorem Ipsum.{0,10}).*?','\1')
from t;

这里. 匹配任何字符,? 用于惰性匹配。对于给定的输入,它会产生:

Lorem Ipsum is simplyindustry. Lorem Ipsum has been ontaining Lorem Ipsum passages,rsions of Lorem Ipsum.

【讨论】:

  • 谢谢。我想我试过这个。但我希望输出如下:Lorem Ipsum 很简单,工业。 Lorem Ipsum 一直在,包含 Lorem Ipsum 段落,Lorem Ipsum 的版本。
  • @user3376592 - 更新了答案。请立即尝试。
  • @Gurwinder Singh 再次感谢您的帮助。该查询似乎是正确的,但它非常慢,它返回整个 clob 数据作为输出而不是字符串。列数据类型是 clob。我们是否需要做一些特殊的事情才能从 clob 中以字符串形式输出?
  • @user3376592 - 如果它在 CLOB 中并且查询速度太慢而无法满足您的需求,则应该使用标准字符串函数而不是正则表达式来重写它。它仍然会很慢,但不会那么慢。但首先请查看我在您原始帖子下的评论中提出的问题 - 您需要提供有关要求本身的更多详细信息。
  • @mathguy 感谢您的澄清。输出应该是这个 Lorem Ipsum 很简单,行业。 Lorem Ipsum 已经包含 Lorem Ipsum 段落,Lorem Ipsum 的版本。 我希望输出有意义。我需要匹配“Lorem Ipsum”前后的 10 个字符。如果前面没有 10 个字符但后面有 10 个字符,则显示后面的 10 个字符以及搜索文本“Lorem Ipsum”。例如:'Lorem Ipsum 只是'是一个匹配'行业。 Lorem Ipsum has been' is a match ' ontaining Lorem Ipsum paragraphs' 是 match 'Lorem Ipsum rsions'。是匹配的
猜你喜欢
  • 2015-06-06
  • 2018-06-27
  • 2021-01-28
  • 2014-11-24
  • 2020-05-12
  • 2019-01-02
  • 2013-04-27
  • 2012-01-14
  • 1970-01-01
相关资源
最近更新 更多