Oracle、XMLTABLE -使用值列表提取数据[重复]

dz6r00yl  于 2023-06-29  发布在  Oracle
关注(0)|答案(2)|浏览(171)

此问题已在此处有答案

Oracle XMLTable- fetching column from parent node(3个答案)
5天前关闭。
我有一个示例XML。

<a>
   <b>
      <id>1</id>
      <comment-list>
        <comment>
     <value>asd</value>
        </comment>
        <comment>
     <value>23</value>
        </comment>
        <comment>
     <value>5436</value>
        </comment>
        <comment>
     <value>123g</value>
        </comment>
      </comment-list>
  </b>
  <b>
  <id>2</id>
      <comment-list>
        <comment>
     <value>asd</value>
        </comment>
        <comment>
     <value>23</value>
        </comment>
        <comment>
     <value>5436</value>
        </comment>
        <comment>
     <value>123g</value>
        </comment>
      </comment-list>
</b>
    </a>

我想要的输出是

id  comment
1   asd
1   23
1   5436
1   123g
2   asd
2   23
2   5436
2   123g

我尝试用xmltable实现:

SELECT  *
 
FROM    (

          SELECT  t1.* 
          FROM    XMLTABLE
                  (
                    '//a/b'
                    PASSING xmltype('       <a>
       <b>
          <id>1</id>
          <comment-list>
            <comment>
         <value>asd</value>
            </comment>
            <comment>
         <value>23</value>
            </comment>
            <comment>
         <value>5436</value>
            </comment>
            <comment>
         <value>123g</value>
            </comment>
          </comment-list>
      </b>
      <b>
      <id>2</id>
          <comment-list>
            <comment>
         <value>asd</value>
            </comment>
            <comment>
         <value>23</value>
            </comment>
            <comment>
         <value>5436</value>
            </comment>
            <comment>
         <value>123g</value>
            </comment>
          </comment-list>
    </b>
        </a>')
                    COLUMNS
                      id                  PATH 'id',
                      comment_list        XMLTYPE PATH 'comment-list'
                  ) t1
        ) t,
        XMLTABLE
        (
          '//comment'
          PASSING t.comment_list
          COLUMNS
            value  PATH 'value'
        ) c

但是笛卡尔出现了。有人知道如何在1 SQL中实现它吗?我的第一个想法是用一个xmltable执行plsql循环,然后在循环中执行另一个循环。这很容易,但是在更大的xml中循环,这将是没有效率的。
有谁知道如何在1 SQL中解决它?
问候

bmvo0sr5

bmvo0sr51#

你可以使用XMLTABLE,为了得到id,你可以使用..返回元素层次结构:

SELECT x.*
FROM   table_name t
       CROSS APPLY XMLTABLE(
         '/a/b/comment-list/comment'
         PASSING XMLTYPE(t.xml)
         COLUMNS
           id NUMBER PATH './../../id',
           comm VARCHAR2(10) PATH './value'
         
       ) x;

其中,对于样本数据:

CREATE TABLE table_name (xml) AS
SELECT '<a>
   <b>
      <id>1</id>
      <comment-list>
        <comment>
     <value>asd</value>
        </comment>
        <comment>
     <value>23</value>
        </comment>
        <comment>
     <value>5436</value>
        </comment>
        <comment>
     <value>123g</value>
        </comment>
      </comment-list>
  </b>
  <b>
  <id>2</id>
      <comment-list>
        <comment>
     <value>asd</value>
        </comment>
        <comment>
     <value>23</value>
        </comment>
        <comment>
     <value>5436</value>
        </comment>
        <comment>
     <value>123g</value>
        </comment>
      </comment-list>
</b>
    </a>' FROM DUAL;

输出:
| 通信| COMM |
| - -----| ------------ |
| ASD| asd |
| 二十三| 23 |
| 五四三六| 5436 |
| 123g| 123g |
| ASD| asd |
| 二十三| 23 |
| 五四三六| 5436 |
| 123g| 123g |
fiddle

imzjd6km

imzjd6km2#

好吧,我错了。它真的有用。在我的xml是100 k字符,我没有注意到,一些id的出现超过-几个节点具有相同的id。
此SQl工作

相关问题