我有一个具有以下结构的xml:
<xml>
<ele1>
<ele2>
<Attribute Key="x1" Value="V1" />
<Attribute Key="x2" Value="V2" />
<Attribute Key="x3" Value="V3" />
<Attribute Key="x4" Value="V4" />
<Attribute Key="x5" Value="V5" />
</ele2>
</ele1>
</xml>
对于每个Key = x1和Key = x3,我想获得值。
目标表/ select应该包含以下列: ele2 | x1 | X2
实际我有以下代码:
SELECT Description.*, Other.*
FROM (select XMLTYPE.createXML(XMLCODE) as XMLCODE from Table) myxml,
XMLTABLE('/ele1/ele2/Attribute[@Key="x1"]'
PASSING myxml.XMLCODE
COLUMNS
"Description" VARCHAR2(255) PATH '@Value'
) Description,
XMLTABLE('/ele1/ele2/Attribute[@Key="x2"]'
PASSING myxml.XMLCODE
COLUMNS
"Other" VARCHAR2(255) PATH '@Value'
) Other;
问题是XMLTables没有加入,我得到了一个笛卡尔积。任何想法还是有更简单的方法?
答案 0 :(得分:0)
这里不需要多个XMLTable调用;你可以通过在columns
子句中提供多个列来复制同一个节点中的多个值(这是一个复数 - 有点线索)。
select x.*
from myTable t
cross join XMLTable('/xml/ele1/ele2'
passing xmltype(t.xmlcode)
columns description varchar2(255) path 'Attribute[@Key="x1"]/@Value',
other varchar2(255) path 'Attribute[@Key="x2"]/@Value'
) x;
两个属性值都来自同一个ele2
节点。