2017-06-29 34 views
0

我有一个存储xml的Oracle DB CLOB字段。我需要使用DistributionNbr标记检索所有xml中的所有值我已经对以下查询使用了相同的参数,并为ref提供了一个示例xml。从定界符分隔的oracle db中提取clob的值

select extract(xmltype(column_name),'//*/xmlpath/text()').getStringval() as g 
from table; 
<xml> 
<ShipConfirm> 
<ShipmentID>000000196</ShipmentID> 
</ShipConfirm> 
<ShipConfirm> 
<ShipmentID>000000197</ShipmentID> 
</ShipConfirm> 
<ShipConfirm> 
<ShipmentID>000000198</ShipmentID> 
</ShipConfirm> 
</xml> 

现在我得到的值作为一个字符串:000000196000000197000000198

我需要在下一行逗号分隔值或值。 000000196,000000197,000000198

OR

000000196 
000000197 
000000198 

回答

0

请避免不必要的“//”,运营商...和列图案隐含相对于行模式

SQL> with MY_TABLE as 
    2 (
    3 select 1 as PRIMARY_KEY, 
    4   XMLTYPE(
    5 '<xml> 
    6 <ShipConfirm> 
    7  <ShipmentID>000000196</ShipmentID> 
    8 </ShipConfirm> 
    9 <ShipConfirm> 
10  <ShipmentID>000000197</ShipmentID> 
11 </ShipConfirm> 
12 <ShipConfirm> 
13  <ShipmentID>000000198</ShipmentID> 
14  </ShipConfirm> 
15 </xml>') as XML_DOC 
16  from DUAL 
17 ) 
18 SELECT LISTAGG(x.ShipmentID, ',') WITHIN GROUP (ORDER BY idx) AS ShipmentIDs 
19 FROM MY_TABLE t, 
20   XMLTABLE(
21   '/xml/ShipConfirm' 
22   PASSING XML_DOC 
23   COLUMNS 
24    idx FOR ORDINALITY, 
25    ShipmentID CHAR(9) PATH 'ShipmentID' 
26  ) x 
27 GROUP BY t.primary_key 
28/

SHIPMENTIDS 
-------------------------------------------------------------------------------- 
000000196,000000197,000000198 

SQL> 
SQL> 
+0

查看LIVESQL在这里https://livesql.oracle.com/apex/livesql/file/content_E7E0NODMZ5BTXA3BXNF2XFB14.html –

+0

非常感谢你 – jabbars

0

使用XMLTABLE

SELECT x.ShipmentID 
FROM your_table t 
     CROSS JOIN 
     XMLTABLE(
     '//xml/ShipConfirm' 
      PASSING XMLTYPE(t.column_name) 
      COLUMNS ShipmentID CHAR(9) PATH './ShipmentID' 
     ) x; 

这将在行其返回。

如果你想把它当作逗号分隔值那么你可以使用:

SELECT LISTAGG(x.ShipmentID, ',') WITHIN GROUP (ORDER BY idx) 
     AS ShipmentIDs 
FROM your_table t 
     CROSS JOIN 
     XMLTABLE(
     '//xml/ShipConfirm' 
      PASSING XMLTYPE(t.column_name) 
      COLUMNS ShipmentID CHAR(9) PATH './ShipmentID', 
        idx FOR ORDINALITY 
     ) x 
GROUP BY t.primary_key; 
+0

在oracle中,CROSS JOIN不是必需的。在由表函数(XMLTABLE)生成的行与为表函数提供输入的行之间存在隐式横向连接。 –

+0

@markddrake您需要一个逗号(其在WHERE条件中没有过滤器,与传统Oracle连接语法中的CROSS JOIN等价)或ANSI连接语法中的CROSS JOIN。我只是使用'CROSS JOIN'作为ANSI语法,而不是恢复到传统语法。 – MT0

相关问题