【问题标题】:Oracle XMLTABLE - how to get following result?Oracle XMLTABLE - 如何获得以下结果?
【发布时间】:2022-01-13 20:19:43
【问题描述】:

我需要在 Oracle 19c 数据库中使用 XMLTABLE 函数获取以下结果:

HEADER_ATTR2   ITEM_ATTR1   ITEM_ATTR2
attr2          attr11       attr12 
attr2          attr21       attr22 
attr2          attr31       attr32 

来自这个 xml:

<body>
  <header>
    <header_attr1>attr1</header_attr1>
    <header_attr2>attr2</header_attr2>
  </header>
  <item>
    <item_attr1>attr11</item_attr1>
    <item_attr2>attr12</item_attr2>
  </item>
  <item>
    <item_attr1>attr21</item_attr1>
    <item_attr2>attr22</item_attr2>
  </item>
  <item>
    <item_attr1>attr31</item_attr1>
    <item_attr2>attr32</item_attr2>
  </item>
</body>

最好的方法是什么?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    从多级 XML(嵌套在不同级别的数据)中提取数据的标准方法是将调用级联到 xmltable。像这样的东西;注意嵌套的“文档”&lt;item&gt; 在第一次传递中是如何被提取为xmltype,然后作为第二次调用xmltable 的基础传递。

    select t.id, x1.header_attr1, x1.header_attr2, x2.item_attr1, x2.item_attr2
    from   t
           cross apply
           xmltable('/body' passing xmltype(xmlstr)
               columns header_attr1 varchar2(20) path 'header/header_attr1',
                       header_attr2 varchar2(20) path 'header/header_attr2',
                       item         xmltype      path 'item'
           ) x1
           cross apply
           xmltable('/item' passing item
               columns item_attr1 varchar2(20) path 'item_attr1',
                       item_attr2 varchar2(20) path 'item_attr2'
           ) x2
    ;
    

    这将产生以下输出:

        ID HEADER_ATTR1     HEADER_ATTR2     ITEM_ATTR1       ITEM_ATTR2      
    ------ ---------------- ---------------- ---------------- --------------
      3001 attr1            attr2            attr11           attr12          
      3001 attr1            attr2            attr21           attr22          
      3001 attr1            attr2            attr31           attr32          
      2048 attr201          attr202          attr--11         attr--12        
      2048 attr201          attr202          attr--21         attr--22        
      2048 attr201          attr202          attr--31         attr--32    
    

    来自以下示例数据:

    create table t (id, xmlstr) as
    select 3001,
    '<body>
      <header>
        <header_attr1>attr1</header_attr1>
        <header_attr2>attr2</header_attr2>
      </header>
      <item>
        <item_attr1>attr11</item_attr1>
        <item_attr2>attr12</item_attr2>
      </item>
      <item>
        <item_attr1>attr21</item_attr1>
        <item_attr2>attr22</item_attr2>
      </item>
      <item>
        <item_attr1>attr31</item_attr1>
        <item_attr2>attr32</item_attr2>
      </item>
    </body>'
    from dual union all
    select 2048,
    '<body>
      <header>
        <header_attr1>attr201</header_attr1>
        <header_attr2>attr202</header_attr2>
      </header>
      <item>
        <item_attr1>attr--11</item_attr1>
        <item_attr2>attr--12</item_attr2>
      </item>
      <item>
        <item_attr1>attr--21</item_attr1>
        <item_attr2>attr--22</item_attr2>
      </item>
      <item>
        <item_attr1>attr--31</item_attr1>
        <item_attr2>attr--32</item_attr2>
      </item>
    </body>'
    from dual;
    

    【讨论】:

      【解决方案2】:

      您可以使用以下方式获取输出:

      SELECT *
      FROM   XMLTABLE(
               '/body/item'
               PASSING XMLTYPE('<body>
        <header>
          <header_attr1>attr1</header_attr1>
          <header_attr2>attr2</header_attr2>
        </header>
        <item>
          <item_attr1>attr11</item_attr1>
          <item_attr2>attr12</item_attr2>
        </item>
        <item>
          <item_attr1>attr21</item_attr1>
          <item_attr2>attr22</item_attr2>
        </item>
        <item>
          <item_attr1>attr31</item_attr1>
          <item_attr2>attr32</item_attr2>
        </item>
      </body>')
               COLUMNS
                 header_attr2 VARCHAR2(20) PATH './../header/header_attr2',
                 item_attr1 VARCHAR2(20) PATH 'item_attr1',
                 item_attr2 VARCHAR2(20) PATH 'item_attr2'
             )
      
      HEADER_ATTR2 ITEM_ATTR1 ITEM_ATTR2
      attr2 attr11 attr12
      attr2 attr21 attr22
      attr2 attr31 attr32

      db小提琴here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-04
        • 2021-09-03
        • 2012-01-11
        • 2013-10-05
        • 1970-01-01
        • 1970-01-01
        • 2012-09-23
        相关资源
        最近更新 更多