【问题标题】:extracting text from a column using regexp_substr使用 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;

没有结果。 任何帮助将不胜感激

【问题讨论】:

    标签: sql regex oracle


    【解决方案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
      /   
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-05
        • 2019-03-21
        • 2011-01-30
        • 2019-12-13
        • 2012-06-26
        • 2021-08-04
        • 2011-05-01
        • 1970-01-01
        相关资源
        最近更新 更多