使用 regexp_substr 从列中提取文本
Posted
技术标签:
【中文标题】使用 regexp_substr 从列中提取文本【英文标题】:extracting text from a column using regexp_substr 【发布时间】:2013-07-17 19:09:47 【问题描述】:我有一个带有 varchar 列的表,其中包含如下数据:
"<tasa>
<parametros>
<parametro>
<nombre>ea</nombre>
<valor>35</valor>
</parametro>
</parametros>
<valorTasa>3.15</valorTasa>
</tasa>"
我需要能够提取valorTasa标签之间的值,但不知道如何使用该功能,无法访问oracle文档。
我正在尝试类似的东西
select regexp_substr(field, '<valorTasa>[0-9]0-3</valorTasa') from dual;
没有结果。 任何帮助将不胜感激
【问题讨论】:
【参考方案1】:更简单的方法是使用extractvalue 函数来提取节点的值。
-- sample of data
SQL> with t1(col) as(
2 select '<tasa>
3 <parametros>
4 <parametro>
5 <nombre>ea</nombre>
6 <valor>35</valor>
7 </parametro>
8 </parametros>
9 <valorTasa>3.15</valorTasa>
10 </tasa>'
11 from dual
12 )
13 select extractvalue(xmltype(col), '/tasa/valorTasa') as res
14 from t1
15 /
RES
-------
3.15
【讨论】:
+1 尼古拉斯 - 不错!我用一个正则表达式的答案向前推进,这很漂亮:)【参考方案2】:实际上REGEXP_REPLACE
最适合这个。如果您将搜索表达式的一部分放在括号中,您可以在第三个“replace-with”参数中引用它——第一个这样的表达式是\1
,第二个是\2
,依此类推直到\9
(你不能超过 9 个)。
根据您的要求,试试这个:
SELECT REGEXP_REPLACE(myXMLCol, '^.*<valorTasa>(.*)</valorTasa>.*$', '\1') FROM myTable
^^^^ ^^
上面括号中的部分 - (.*)
映射到 \1
。 Oracle REGEXP_REPLACE
文档比我解释得更好:)
【讨论】:
【参考方案3】:SELECT regexp_replace(
regexp_substr(field, '<valorTasa>[0-9\.]+</valorTasa>'),
'<valorTasa>([0-9\.]+)</valorTasa>',
'\1')
from dual;
【讨论】:
一个简单的替换就可以解决这个问题。感谢您的建议。【参考方案4】:对于多行 XML 文档,正如我们在此处所使用的,可以使用 regexp_replace 例程,但只能使用正确的 match_parameter = mn:
with t1(col) as(
select '<tasa>
<parametros>
<parametro>
<nombre>ea</nombre>
<valor>35</valor>
</parametro>
</parametros>
<valorTasa>3.15</valorTasa>
</tasa>'
from dual
)
select
REGEXP_REPLACE(col, '^.*<valorTasa>(.*)</valorTasa>.*$', '\1', 1, 0, 'mn') as res
from t1
/
【讨论】:
以上是关于使用 regexp_substr 从列中提取文本的主要内容,如果未能解决你的问题,请参考以下文章