我有一张桌子,如下:
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>
标签内每一行的值。我该怎么办?
答案 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字符串实际上格式错误-在最后一个结束标记中缺少斜杠-那么您需要先解决该问题。