【问题标题】:How to get the value between 2 string in oracle sql如何在oracle sql中获取2个字符串之间的值
【发布时间】:2015-04-01 07:26:41
【问题描述】:

我有一个 SOAP_MONITORING 表,该表具有 RESPONSE_XML 列,该列是 CLOB 数据类型并由大字符串组成。我需要获取并显示隐藏在此字符串中的所有 SUBSCRIPTION_ID。 SUBSCRIPTION_ID 位于此字符串中:<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>201411211617575057</ax2130:id>。我必须获取所有 ID,它只是位于<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id> and </ax2130:id> string 之间的我的 SUBSCRIPTION_ID。我尝试了以下查询:

   SELECT REPLACE(REPLACE(MatchedId, '<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>', ''), '</ax2130:id>', '') 
FROM
(
SELECT   REGEXP_SUBSTR(RESPONSE_XML, '<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>\d+</ax2130:id>') 
FROM  SOAP_MONITORING 
)
WHERE 
WEB_SERVICE_NAME='RatorWebShopService' and WEB_METHOD_NAME='placeShopOrder'

但收到一个空结果。

【问题讨论】:

  • 简单的 SUBSTR 和 INSTR 就足够了。为什么要将xmltype 存储到CLOB 中?
  • 我没用过。它来自我正在查询的客户端数据库。我没有更改列类型的写入权限。只有我可以在这个数据库中使用 Select 语句并查询表。
  • 您说原始数据与您在问题中提供的不一样。您为什么不编辑您的问题并提供正确的信息以避免不必要的讨论。

标签: sql string oracle substring clob


【解决方案1】:

我认为这是正则表达式可以帮助您的情况。 here 是来自 oracle 文档的参考。

正则表达式可能类似于:

<ax2130:id>\d+</ax2130:id>

如果您的 ID 仅为数字。

更新

这里还有一个您可以使用的示例查询:

SELECT REPLACE(REPLACE(MatchedId, '<ax2130:id>', ''), '</ax2130:id>', '') AS CleanMatch
FROM
(
    SELECT   REGEXP_SUBSTR(RESPONSE_XML, '<ax2130:id>\d+</ax2130:id>') AS MatchedId
    FROM     SOAP_MONITORING
)
WHERE 
MatchedId is not null

http://sqlfiddle.com/#!4/d473c/5

【讨论】:

  • 是的,只有它的 didigts。你能告诉我如何查询吗?
  • @ajay 更新了答案以显示示例和指向 sqlfiddle 上工作查询的链接
  • 我尝试了这个查询,但在查询结果中它现在显示任何内容。它返回 null :(
  • 它在我共享的 sql fiddler 链接上工作正常,请确保您的数据具有标签 ''
  • 我在代码中提到 RESPONSE_XML 是 CLOB 类型的。它适用于 CLOB 数据类型吗?我只是复制粘贴您的查询。所以它包含 ''
【解决方案2】:

CLOB 在很多方面都不能像varchar 那样处理如果您的列包含 XML,您应该考虑使用 Oracles xmltype 数据类型。在这种情况下,您可以使用 XML-Tools 来查询您的数据:即

select extractvalue(response_xml, '/response_xml/id/text()')
from soap_monitoring
order by  extractvalue(response_xml, '/response_xml/id/text()') desc

【讨论】:

  • 它给出了相同的错误,即不一致的数据类型。
  • 因为您错过了答案是针对 xmltype 而不是针对 CLOB 数据类型。
  • @ajay - 可以追溯到your earlier question。你可以转换它,但你最终会遇到数据库链接问题。
  • 是的,这就是为什么我尝试使用 SUBSTR 函数来解决数据库链接问题
【解决方案3】:

请检查以下您已编辑的问题

 with unique_data as (select '<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO">' data from dual)

    select  SUBSTR(MatchedId,instr(MatchedId,'>')+1 , instr(MatchedId,'</') - length('</ax2130:id>')) from
    (
    SELECT   replace(dbms_lob.substr(RESPONSE_XML,length(response_xml),dbms_lob.instr(response_xml,data)),data,'') AS MatchedId
    FROM     SOAP_MONITORING,unique_data
    )
    WHERE 
    MatchedId is not null;

【讨论】:

  • 在较新的版本中,您不需要DBMS_LOB.SUBSTR,至少从 10g 开始。
  • 根据我的测试,Substr 在 11g 版本中速度较慢1 stackoverflow.com/questions/27547107/…
  • 比什么慢?您的链接将其与正则表达式进行比较,在这种情况下,substr 将始终比regexp 快。顺便说一句,我的观点与正则表达式无关。我说,你可以简单地使用SUBTR 而不是DBMS_LOB.SUBSTR
猜你喜欢
  • 1970-01-01
  • 2020-02-06
  • 2013-02-09
  • 1970-01-01
  • 2015-02-18
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多