You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle SQL提取多行XML字段中指定字符串间的内容

Oracle提取XML转义字符串中指定标签内容的解决方案

核心问题分析

你之前使用的正则表达式\:(.+)\~完全不匹配目标字符串的结构,导致返回NULL。需要针对XML转义后的标签结构编写正确的正则规则。

解决方案

1. 提取包含指定属性名(如attr4)的标签内容

适用于从第一行提取7,5,即使属性名带括号(如attribute (m))也能处理:

-- 提取包含attr4的标签内数值
SELECT REGEXP_SUBSTR(
    '<attr name="attr1; attr2; attr3; attr4">7,5</attr>
<attr name="attr5; attr6; attr7; attr8">3,5</attr>',
    '<attr name="[^"]*attr4[^"]*">([^<]+)</attr>',
    1, 1, NULL, 1
) AS first_target_value
FROM dual;

正则规则解释:

  • <attr name=":匹配转义后的标签开头
  • [^"]*attr4[^"]*:匹配包含attr4的属性名称部分([^"]*表示任意非双引号转义的字符)
  • ">:匹配转义后的标签属性结束部分
  • ([^&lt;]+):捕获标签内的数值([^&lt;]+表示任意非<转义的字符,即目标内容)
  • &lt;/attr&gt;:匹配转义后的标签结尾

2. 处理带括号的属性名

如果属性名是attribute (m),需要转义正则中的特殊字符(和):

-- 提取包含带括号属性名的标签内数值
SELECT REGEXP_SUBSTR(
    '&lt;attr name=&quot;attr1; attribute (m)&quot;&gt;7,5&lt;/attr&gt;',
    '&lt;attr name=&quot;[^&quot;]*attribute \(m\)[^&quot;]*&quot;&gt;([^&lt;]+)&lt;/attr&gt;',
    1, 1, NULL, 1
) AS target_value_with_paren
FROM dual;

3. 提取第二行的3,5

可以通过两种方式实现:

方法1:按标签出现次数提取

SELECT REGEXP_SUBSTR(
    '&lt;attr name=&quot;attr1; attr2; attr3; attr4&quot;&gt;7,5&lt;/attr&gt;
&lt;attr name=&quot;attr5; attr6; attr7; attr8&quot;&gt;3,5&lt;/attr&gt;',
    '&lt;attr name=&quot;[^&quot;]*&quot;&gt;([^&lt;]+)&lt;/attr&gt;',
    1, 2, NULL, 1
) AS second_target_value
FROM dual;

方法2:按第二行的属性名(如attr8)提取

SELECT REGEXP_SUBSTR(
    '&lt;attr name=&quot;attr1; attr2; attr3; attr4&quot;&gt;7,5&lt;/attr&gt;
&lt;attr name=&quot;attr5; attr6; attr7; attr8&quot;&gt;3,5&lt;/attr&gt;',
    '&lt;attr name=&quot;[^&quot;]*attr8[^&quot;]*&quot;&gt;([^&lt;]+)&lt;/attr&gt;',
    1, 1, NULL, 1
) AS second_target_value
FROM dual;

关键参数说明

Oracle的REGEXP_SUBSTR函数第6个参数用于指定捕获组编号,这里我们用1来提取正则中括号()包裹的目标内容。

内容的提问来源于stack exchange,提问作者asa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 06:34:54