【问题标题】:Summing the child nodes in an XML using oracle sql使用 oracle sql 对 XML 中的子节点求和
【发布时间】:2017-11-18 10:57:13
【问题描述】:

我有以下格式的 XML

<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>

现在我想要一个查询 Oracle SQL 查询,它返回数量节点的总和。

我编写了一个连接值的查询。

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

这给了我 3214,这是连接的值,但我想要 10,这是总和。

【问题讨论】:

    标签: sql xml oracle


    【解决方案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

    【讨论】:

    • 谢谢。我搜索了一个解决方案,根本找不到!你是从哪里学来的?如果你能给我一篇文章或其他东西会很棒!
    • 很高兴听到!很高兴我能帮上忙。在 Oracle xmltable 上进行简单的 Google/Bing 搜索可以帮助您找到教程、文档,甚至 SO 帖子。如果您不知道该术语,只需搜索如何在 Oracle 中查询 XML。有很多例子。
    猜你喜欢
    • 2014-03-20
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2021-08-15
    相关资源
    最近更新 更多