2017-11-14 2 views
0

Aus dem folgenden XML möchte ich Folgendes zurückgeben.SQL oder PL/SQL, um den Wert von Knoten mit demselben Namen in einer Zeile zurückzugeben

ID   Departments 
----------- ------------------------------ 
EMP10Level1 98,850,876,896,901,908,936,987 

Ich habe ein paar Dinge ausprobiert, wie die XML und mit Listagg Parsen, sondern für jeden ID die gleichen Werte immer ist.

Hoffentlich kann ein aufklärerischer Geist dieses Problem für mich lösen.

Ist auch eine Spalte namens ID, die EMP10Level1 enthält. Dies ist der Wert aus dem PromotionID-Tag unten.

<Promotion> 
    <MajorVersion>1</MajorVersion> 
    <MinorVersion>7</MinorVersion> 
    <PromotionID>EMP10Level1</PromotionID> 
    <MultibuyGroup> 
     <UseLowestNetValue>0</UseLowestNetValue> 
     <MMGroupID>850</MMGroupID> 
     <MMGroupID>901</MMGroupID> 
     <MMGroupID>908</MMGroupID> 
     <MMGroupID>936</MMGroupID> 
     <MMGroupID>896</MMGroupID> 
     <MMGroupID>987</MMGroupID> 
     <MMGroupID>876</MMGroupID> 
     <MMGroupID>98</MMGroupID> 
     <TriggerOnLostSales>0</TriggerOnLostSales> 
    </MultibuyGroup> 
</Promotion> 

Antwort

0

Hier ist eine Möglichkeit, mit Art-of-verschachtelten XMLTABLEs:

WITH sample_data AS (SELECT XMLTYPE('<Promotion> 
    <MajorVersion>1</MajorVersion> 
    <MinorVersion>7</MinorVersion> 
    <PromotionID>EMP10Level1</PromotionID> 
    <MultibuyGroup> 
     <UseLowestNetValue>0</UseLowestNetValue> 
     <MMGroupID>850</MMGroupID> 
     <MMGroupID>901</MMGroupID> 
     <MMGroupID>908</MMGroupID> 
     <MMGroupID>936</MMGroupID> 
     <MMGroupID>896</MMGroupID> 
     <MMGroupID>987</MMGroupID> 
     <MMGroupID>876</MMGroupID> 
     <MMGroupID>98</MMGroupID> 
     <TriggerOnLostSales>0</TriggerOnLostSales> 
    </MultibuyGroup> 
</Promotion>') xmldata FROM dual) 
SELECT ids.id, 
     listagg(depts.department, ',') WITHIN GROUP (ORDER BY depts.department) departments 
FROM sample_data sd 
     CROSS JOIN XMLTABLE('/Promotion' PASSING sd.xmldata 
          COLUMNS ID VARCHAR2(20) PATH 'PromotionID', 
            dept_xml XMLTYPE PATH 'MultibuyGroup') ids 
     CROSS JOIN XMLTABLE('//MMGroupID' PASSING ids.dept_xml 
          COLUMNS department INTEGER PATH '.') depts 
GROUP BY ids.id; 

ID     DEPARTMENTS 
-------------------- -------------------------------------------------------------------------------- 
EMP10Level1   98,850,876,896,901,908,936,987 
+0

Ausgezeichnete Lösung, es geändert refererence meine tatsächlichen DB-Spalten und es zieht die Daten wie erforderlich heraus. Danke vielmals. – user3811820

0

Nicht sehr elegant, aber hier ist eine andere, die funktioniert:

WITH TBL 
    AS (SELECT xmltype (
        '<Promotion> 
        <MajorVersion>1</MajorVersion> 
        <MinorVersion>7</MinorVersion> 
        <PromotionID>EMP10Level1</PromotionID> 
        <MultibuyGroup> 
         <UseLowestNetValue>0</UseLowestNetValue> 
         <MMGroupID>850</MMGroupID> 
         <MMGroupID>901</MMGroupID> 
         <MMGroupID>908</MMGroupID> 
         <MMGroupID>936</MMGroupID> 
         <MMGroupID>896</MMGroupID> 
         <MMGroupID>987</MMGroupID> 
         <MMGroupID>876</MMGroupID> 
         <MMGroupID>98</MMGroupID> 
         <TriggerOnLostSales>0</TriggerOnLostSales> 
        </MultibuyGroup> 
       </Promotion>') 
        Col1 
      FROM DUAL) 
SELECT EXTRACTVALUE (col1, 'Promotion/PromotionID') AS ID, 
     LTRIM (
      REPLACE (
      REPLACE (EXTRACT (col1, 'Promotion/MultibuyGroup/MMGroupID'), 
         '<MMGroupID>', 
         ','), 
      '</MMGroupID>'), 
      ',') 
      AS DEPT 
    FROM tbl 
+0

Auch gut funktioniert vielen Dank. – user3811820

+0

Ich würde die OP-Tests sowohl meine als auch diese Antwort wärmstens empfehlen, um zu sehen, welche für ihren Fall leistungsfähiger ist. Ich habe gefunden, dass XMLTABLE schneller als EXTRACT/EXTRACTVALUE ist, aber das könnte gerade in diesem speziellen Szenario gewesen sein (welches nicht dieses ist). Ich wäre an den Ergebnissen interessiert, besonders wenn diese Antwort performanter ist. – Boneist

Verwandte Themen