Sql 使用regexp\u substr从列中提取文本
我有一个带有varchar列的表,其中包含如下数据:Sql 使用regexp\u substr从列中提取文本,sql,regex,oracle,Sql,Regex,Oracle,我有一个带有varchar列的表,其中包含如下数据: "<tasa> <parametros> <parametro> <nombre>ea</nombre> <valor>35</valor> </parametro> </parametros> <valorTasa>3.15</valorTasa> </
"<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;
没有结果。
任何帮助都将不胜感激更简单的方法是使用函数提取节点的值
-- 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
实际上,REGEXP\u REPLACE最适合这种情况。如果将搜索表达式的一部分放在括号中,则可以在第三个replace with参数中引用它-第一个这样的表达式是\1,第二个是\2,以此类推直到\9,最多只能执行9次
根据您的要求,请尝试以下方法:
SELECT REGEXP_REPLACE(myXMLCol, '^.*<valorTasa>(.*)</valorTasa>.*$', '\1') FROM myTable
^^^^ ^^
上面括号中的部分-.*映射到\1。Oracle文档对此的解释比我更好:对于多行XML文档,正如我们在这里看到的,可以使用regexp\u replace例程,但只能使用正确的match\u parameter=mn:
SELECT regexp_replace(
regexp_substr(field, '<valorTasa>[0-9\.]+</valorTasa>'),
'<valorTasa>([0-9\.]+)</valorTasa>',
'\1')
from dual;
+尼古拉斯-很好!我用了一个正则表达式的答案,这是一个非常圆滑的答案:在这个地方,一个简单的替换就可以了。谢谢你的建议。
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
/