【问题标题】:Extract distinct values from XML based on attribute value根据属性值从 XML 中提取不同的值
【发布时间】:2021-09-24 06:33:55
【问题描述】:

我需要从 XML 中提取 doc_numxkod = 'N',如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<main doc_num=99>
<item name="A">
    <Dok Kod="N" X="1" Id="5"/>
    <Dok Kod="N" X="4" Id="5"/>
</item>
<item name="B">
    <Dok Kod="N" X="1" Id="2"/>
    <Dok Kod="N" X="4" Id="6"/>
    <Dok Kod="N" X="5" Id="8"/>
    <Dok Kod="Z" X="4553" Id="8"/>
</item>
</main>

输出应该是这样的,我只需要 distinct:

doc_num     X
99          1
99          4
99          5 

【问题讨论】:

    标签: sql xml oracle oracle11g


    【解决方案1】:

    您可以将 XMLTable 与以 Kod=N 节点为目标的 Xpath 一起使用,然后返回树以获取 doc_num;此版本假定您的原始值是一个字符串:

    select distinct xml.doc_num, xml.x
    from your_table t
    cross apply xmltable (
      '/main/item/Dok[@Kod="N"]'
      passing xmltype(t.your_xml)
      columns doc_num number path './../../@doc_num',
        x number path '@X'
    ) xml
    
    DOC_NUM X
    ------- -
         99 1
         99 4
         99 5
    

    db<>fiddle

    如果您的原始值已经是 XMLType,那么返回树并不能按预期工作 - 不确定这是否是一个错误,但至少在 11gR2 和 18c 中似乎发生了。您可以通过转换为字符串并返回来解决此问题:

    select distinct xml.doc_num, xml.x
    from your_table t
    cross apply xmltable (
      '/main/item/Dok[@Kod="N"]'
      passing xmltype(t.your_xml.getclobval())
      columns doc_num number path './../../@doc_num',
        x number path '@X'
    ) xml
    
    DOC_NUM X
    ------- -
         99 1
         99 4
         99 5
    

    db<>fiddle


    我刚刚注意到您为 Oracle 11g 标记了这个...所以交叉应用不可用,并且走回树上也行不通;也不过滤子属性名称。因此,您可以改为使用两个级别的 XMLTable:

    select distinct xml1.doc_num, xml2.x
    from your_table t
    cross join xmltable (
      '/main'
      passing xmltype(t.your_xml)
      columns doc_num number path '@doc_num',
        doks xmltype path 'item/Dok'
    ) xml1
    cross join xmltable (
      '/Dok'
      passing xml1.doks
      columns kod varchar2(1) path '@Kod',
        x number path '@X'
    ) xml2
    where xml2.kod = 'N'
    
    DOC_NUM X
    ------- -
         99 1
         99 4
         99 5
    

    适用于 11g with a stringwith an XMLType 源。

    【讨论】:

      猜你喜欢
      • 2021-03-27
      • 2019-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多