2017-08-16 48 views
0

我有以下结构的一个xml:获取XML属性对甲骨文CLOB与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> 

每个键= x1和重点=×3,我想要得到的价值。

目标表/ 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

您所显示的代码并未显示您遇到的问题。如果XPath将'/ xml'添加到开始,所以它找到任何东西,它只返回一行。即使添加第二行样本数据仍然只会得到两个结果 - 而不是四个,正如您似乎暗示的那样。你可以编辑你的问题,以显示更多的代表性数据,你目前得到的输出和你想要的输出吗?我可以猜到你可能真的有什么,但我不应该... –

回答

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节点到来。

+0

太好了,谢谢!那就是我正在寻找的语法 – Dominik

+0

也许你知道一种排除空值的方法吗?意思是where子句x1值不为空且x2值不为空 – Dominik

+0

不太确定你的意思。你可以在XQuery中过滤它,但是也可以在末尾粘贴一个'where'子句来筛选结果:'其中x.description不为null,x.other不为空'。 –