您可以将 XMLTable 与以 Kod=N 节点为目标的 Xpath 一起使用,然后返回树以获取 doc_num;此版本假定您的原始值是一个字符串:
select distinct xml.doc_num, xml.x
from your_table t
cross apply xmltable (
'/main/item/Dok[@Kod="N"]'
passing xmltype(t.your_xml)
columns doc_num number path './../../@doc_num',
x number path '@X'
) xml
DOC_NUM X
------- -
99 1
99 4
99 5
db<>fiddle
如果您的原始值已经是 XMLType,那么返回树并不能按预期工作 - 不确定这是否是一个错误,但至少在 11gR2 和 18c 中似乎发生了。您可以通过转换为字符串并返回来解决此问题:
select distinct xml.doc_num, xml.x
from your_table t
cross apply xmltable (
'/main/item/Dok[@Kod="N"]'
passing xmltype(t.your_xml.getclobval())
columns doc_num number path './../../@doc_num',
x number path '@X'
) xml
DOC_NUM X
------- -
99 1
99 4
99 5
db<>fiddle
我刚刚注意到您为 Oracle 11g 标记了这个...所以交叉应用不可用,并且走回树上也行不通;也不过滤子属性名称。因此,您可以改为使用两个级别的 XMLTable:
select distinct xml1.doc_num, xml2.x
from your_table t
cross join xmltable (
'/main'
passing xmltype(t.your_xml)
columns doc_num number path '@doc_num',
doks xmltype path 'item/Dok'
) xml1
cross join xmltable (
'/Dok'
passing xml1.doks
columns kod varchar2(1) path '@Kod',
x number path '@X'
) xml2
where xml2.kod = 'N'
DOC_NUM X
------- -
99 1
99 4
99 5
适用于 11g with a string 或 with an XMLType 源。