我有一个列
的表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查询中提取文本?
答案 0 :(得分:4)
这是一种方法 - 虽然格式需要保持如上:
SELECT XMLTYPE(REPLACE(REPLACE(DETAIL,'<![CDATA[',''),']]>','')).EXTRACT('/DIV/SPAN/text()').GETSTRINGVAL()
FROM yourtable
基本上,这会将详细信息列转换为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;