来自CDATA的Oracle提取值

时间:2013-03-22 03:13:37

标签: sql oracle

我有一个列

的表
DETAIL         VARCHAR2(4000)  

存储在DETAIL列中的一个示例数据是

<![CDATA[<DIV STYLE="text-align:LEFT;"><SPAN STYLE="letter-spacing:0px;color:#000000;font-size:10px;font-family:'Verdana';">Value to be extract</SPAN></DIV>]]>

有没有办法在SQL select查询中提取文本?

3 个答案:

答案 0 :(得分:4)

这是一种方法 - 虽然格式需要保持如上:

SELECT XMLTYPE(REPLACE(REPLACE(DETAIL,'<![CDATA[',''),']]>','')).EXTRACT('/DIV/SPAN/text()').GETSTRINGVAL() 
FROM yourtable

SQL Fiddle Demo

基本上,这会将详细信息列转换为html(删除cdata信息),然后使用getstringval返回某些标记之间的值。

http://docs.oracle.com/cd/B12037_01/appdev.101/b10790/xdb04cre.htm#i1024803

答案 1 :(得分:1)

regexp_substr(detail, '>([^<]+)<', 1, 1, '', 1)

fiddle - 感谢sgeddes

答案 2 :(得分:1)

通过Oracle XML DB功能执行此类操作的正确方法:

select 
  value_test
from 
XMLTable('$p'    
  passing XMLParse(content '<![CDATA[<DIV STYLE="text-align:LEFT;"><SPAN STYLE="letter-spacing:0px;color:#000000;font-size:10px;font-family:''Verdana'';">Value to be extract</SPAN></DIV>]]>')
  as "p"
  columns value_test varchar2(4000) path '/text()'
);

另一种变体:

select
  dbms_xmlgen.convert(
    XMLQuery('data($p)'    
      passing by value XMLParse(content '<![CDATA[<DIV STYLE="text-align:LEFT;"><SPAN STYLE="letter-spacing:0px;color:#000000;font-size:10px;font-family:''Verdana'';">Value to be extract</SPAN></DIV>]]>')
      as "p"          
      returning content
    ).getCLOBVal(), 
    1
  )  
from dual;