使用 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 从列中提取文本的主要内容,如果未能解决你的问题,请参考以下文章

Python - 从列中提取/复制分隔文本到新列 xlsx

使用正则表达式从 mysql 列中提取子字符串

从列中提取某些单词

Excel从列中提取和平均值

Google BigQuery 使用 regexp_extract 从列中提取字符串

从列中的字符串中提取每行的最大值