2017-08-16 30 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不爲空'。 –