提取存储在varchar2列中的XML标签数据

时间:2018-08-03 10:36:52

标签: sql xml oracle

我有一张桌子,如下:

    ID  Name      Roll         Data
    1   ABC        12       <ngc_mid_nu_3><tid_nu><status>A</status> 
                            <term_no>03</term_no> 
                            </tid_nu><tid_nu><status>A</status> 
                            <term_no>04</term_no> 
                            </tid_nu><ngc_mid_nu_3>
   2    XYZ        32       <ngc_mid_nu_3><tid_nu><status>B</status> 
                            <term_no>08</term_no> 
                            </tid_nu><tid_nu><status>A</status> 
                            <term_no>04</term_no> 
                            </tid_nu><ngc_mid_nu_3>

所有列均为varchar2,包括名为Data的列。

我想获取<status>标签和<term_no>标签内每一行的值。我该怎么办?

1 个答案:

答案 0 :(得分:1)

您可以使用XMLTable交叉连接表行,该XMLTable提取所需的所有字段:

select t.id, t.name, t.roll, x.status, x.term_no
from your_table t
cross join xmltable ('/ngc_mid_nu_3/tid_nu'
  passing xmltype(t.data)
  columns status varchar2(10) path 'status',
    term_no varchar2(10) path 'term_no'
) x;

根据您希望实际看到的数据,适当设置columns数据类型和大小。

在CTE中使用示例数据进行演示(在XML中带有固定的结束标记-即</ngc_mid_nu_3>而不是<ngc_mid_nu_3>

with your_table (ID, Name, Roll, Data) as (
select 1, 'ABC', 12, '<ngc_mid_nu_3><tid_nu><status>A</status> 
<term_no>03</term_no> 
</tid_nu><tid_nu><status>A</status> 
<term_no>04</term_no> 
</tid_nu></ngc_mid_nu_3>' from dual
union all
select 2, 'XYZ', 32, '<ngc_mid_nu_3><tid_nu><status>B</status> 
<term_no>08</term_no> 
</tid_nu><tid_nu><status>A</status> 
<term_no>04</term_no> 
</tid_nu></ngc_mid_nu_3>' from dual
)
select t.id, t.name, t.roll, x.status, x.term_no
from your_table t
cross join xmltable ('/ngc_mid_nu_3/tid_nu'
  passing xmltype(t.data)
  columns status varchar2(10) path 'status',
    term_no varchar2(10) path 'term_no'
) x;

        ID NAME             ROLL STATUS     TERM_NO   
---------- ---------- ---------- ---------- ----------
         1 ABC                12 A          03        
         1 ABC                12 A          04        
         2 XYZ                32 B          08        
         2 XYZ                32 A          04        

如果您的真实XML字符串实际上格式错误-在最后一个结束标记中缺少斜杠-那么您需要先解决该问题。