我有一个带有 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;
没有结果。 任何帮助将不胜感激
答案 0 :(得分:8)
更简单的方法是使用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 :(得分:3)
实际上REGEXP_REPLACE
最适用于此。如果将搜索表达式的一部分放在括号中,可以在第三个“替换”参数中引用它 - 第一个表达式为\1
,第二个表达式为\2
,依此类推至\9
(你不能超过9)。
根据您的要求,试试这个:
SELECT REGEXP_REPLACE(myXMLCol, '^.*<valorTasa>(.*)</valorTasa>.*$', '\1') FROM myTable
^^^^ ^^
上面括号中的部分 - (.*)
映射到\1
。 Oracle REGEXP_REPLACE
文档比我更好地解释了这一点:)
答案 2 :(得分:2)
SELECT regexp_replace(
regexp_substr(field, '<valorTasa>[0-9\.]+</valorTasa>'),
'<valorTasa>([0-9\.]+)</valorTasa>',
'\1')
from dual;
答案 3 :(得分:1)
对于多行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
/