2013-07-17 2 views
4

У меня есть таблица с VarChar колонками с данными, как это:извлечения текста из колонки с использованием REGEXP_SUBSTR

"<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; 

без результатов. Любая помощь была бы принята с благодарностью

ответ

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 
+0

+1 Николас - хорошо! Я пахал с регулярным выражением, и это много slicker :) –

3

Фактически REGEXP_REPLACE будет работать лучше всего для этого. Если вы помещаете часть выражения поиска в круглые скобки, вы можете ссылаться на нее в третьем параметре «replace-with» - первое такое выражение - \1, второе - \2 и т. Д. До \9 (вы не можете сделать более 9).

Для вашего требования, попробуйте следующее:

SELECT REGEXP_REPLACE(myXMLCol, '^.*<valorTasa>(.*)</valorTasa>.*$', '\1') FROM myTable 
               ^^^^     ^^ 

части, в указанных скобках - (.*) карты до \1. В Oracle REGEXP_REPLACE документы объяснить это лучше, чем я могу :)

2
SELECT regexp_replace(
      regexp_substr(field, '<valorTasa>[0-9\.]+</valorTasa>'), 
      '<valorTasa>([0-9\.]+)</valorTasa>', 
      '\1') 
from dual; 
+0

Простая замена сделала бы трюк в этом месте. Спасибо за ваше предложение. –

1

Для многострочных документов XML, как мы здесь, REGEXP_REPLACE процедура может быть использована, но только при правильном параметр_сопоставления = млн:

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 
/ 
Смежные вопросы