【问题标题】:Oracle SUBSTR XML ParseOracle SUBSTR XML 解析
【发布时间】:2015-09-20 08:02:38
【问题描述】:

我在表中有某些具有不同 XML 结构的值。

有一个标签<problemDesc> 'error' </problemDesc> 它存在于所有 XML 块中。

如何使用 SubStr 和 InStr 函数从标签中提取错误?或者有没有办法获得价值。

【问题讨论】:

    标签: sql xml plsql


    【解决方案1】:

    使用字符串函数解析 XML 不是一个好主意。改用内置的 XML 解析功能:

    SqlFiddleDemo

    select *  
    FROM 
         XMLTABLE('//problemDesc'  
             PASSING   
                xmltype('<problemDesc>error</problemDesc>')
             COLUMNS  
                error  varchar2 (200) PATH '.'  
         ) xmlt  
    ;
    

    【讨论】:

      【解决方案2】:

      虽然我同意这是一个坏主意,但以您提出的类似问题的方式回答问题是可行的:

      SELECT SUBSTR('<problemDesc>Error 1</problemDesc>', 
        INSTR('<problemDesc>Error 1</problemDesc>', '<problemDesc>') + LENGTH('<problemDesc>'), 
        INSTR('<problemDesc>Error 1</problemDesc>', '</problemDesc>') - (INSTR('<problemDesc>Error 1</problemDesc>', '<problemDesc>') + LENGTH('<problemDesc>')))
      FROM DUAL;
      

      换句话说

      SELECT SUBSTR(COL_NAME, 
        INSTR(COL_NAME, '<problemDesc>') + LENGTH('<problemDesc>'), 
        INSTR(COL_NAME, '</problemDesc>') - (INSTR(COL_NAME, '<problemDesc>') + LENGTH('<problemDesc>')))
      FROM SOME_TABLE;
      

      这只有在这些标签不出现多次时才有效。但是,理论上您正在寻找 START 标签的开头,并且想要转到 END 标签的开头。

      【讨论】:

        【解决方案3】:

        为什么要进行字符串操作?? 试试这个:

        SQL> select extractvalue(xmltype('<a>abhi</a>'),'//a/text()') from dual;
        
        EXTRACTVALUE(XMLTYPE('<A>ABHI<
        --------------------------------------------------------------------------------
        abhi
        

        【讨论】:

          猜你喜欢
          • 2014-12-28
          • 2019-02-02
          • 2020-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-01
          相关资源
          最近更新 更多