2017-11-18 149 views
1

總結子節點在XML我有以下格式使用Oracle SQL

<Receive 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Date>20171106</Date> 
    <ReceiptDetails> 
     <ReceiptDetail> 
      <Quantity>3</Quantity> 
     </ReceiptDetail> 
     <ReceiptDetail> 
      <Quantity>2</Quantity> 
     </ReceiptDetail> 
     <ReceiptDetail> 
      <Quantity>1</Quantity> 
     </ReceiptDetail> 
     <ReceiptDetail> 
      <Quantity>4</Quantity> 
     </ReceiptDetail> 
    </ReceiptDetails> 
</Receive> 

XML現在我想查詢的Oracle SQL查詢返回我的節點數量的總和。

我寫了一個連接值的查詢。

SELECT 
XMLTYPE(t.REQ_MSG).EXTRACT('//Receive/ReceiptDetails/ReceiptDetail/Quantity/text()').getStringVal() 
FROM 
    TABLE_NAME t; 

這給了我3214這是連接值,但我想要10這是總和。

回答

1

考慮使用XMLTABLE將XML節點解析到列中,然後在外部查詢中進行聚合。

SELECT SUM(e.Quantity) AS SumQuantity 

FROM XMLTABLE('/Receive/ReceiptDetails/ReceiptDetail' 
     PASSING XMLTYPE('<Receive xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
          <Date>20171106</Date> 
          <ReceiptDetails> 
           <ReceiptDetail> 
            <Quantity>3</Quantity> 
           </ReceiptDetail> 
           <ReceiptDetail> 
            <Quantity>2</Quantity> 
           </ReceiptDetail> 
           <ReceiptDetail> 
            <Quantity>1</Quantity> 
           </ReceiptDetail> 
           <ReceiptDetail> 
            <Quantity>4</Quantity> 
           </ReceiptDetail> 
          </ReceiptDetails> 
         </Receive>') 
     COLUMNS 
     Quantity NUMBER PATH 'Quantity') as e 

以及XML列在一個表中

SELECT SUM(e.Quantity) AS SumQuantity 

FROM MY_TABLE, 
     XMLTABLE('/Receive/ReceiptDetails/ReceiptDetail' 
     PASSING XMLTYPE(MY_TABLE.MY_XML_COLUMN) 

     COLUMNS 
     Quantity NUMBER PATH 'Quantity') as e 

Rextester Demo

+0

感謝您的。我搜索了一個解決方案根本找不到它!你從哪裏學到的?如果你能給我一篇文章或什麼是好的! – vik123

+0

很好聽!很高興我能幫上忙。 * Oracle xmltable *上的簡單Google/Bing搜索可以幫助您查找教程,文檔,甚至是SO帖子。如果您不知道該術語,只需搜索如何在Oracle中查詢XML。那裏有很多例子。 – Parfait