2016-10-31 3 views
1
<phone type="work">905-555-7258</phone> 
<phone type="home">416-555-2937</phone> 
<phone type="cell">905-555-8743</phone> 
<phone type="cottage">613-555-3278</phone> 
... 

SELECT 
     XMLCAST(XMLQUERY ('$d/customerinfo/phone[n]/@type' 
         PASSING INFO AS "d") as VARCHAR(128)) type, 
     XMLCAST(XMLQUERY ('$d/customerinfo/phone[n]' 
         PASSING INFO AS "d") as VARCHAR(128)) number 
FROM CUSTOMER; 

Wie kann ich n Telefonnummern auswählen? Ich denke über etwas wie eine for-Schleife (Java) nach, aber ich finde keine Möglichkeit, dies in SQL für DB2 zu tun. Irgendwelche Ideen?db2 SQL XMLQUERY LOOP

+0

Könnten Sie hinzufügen, wie viele Dokumente, die Sie haben und die erwartete Ausgabe? Es sollte möglich sein, indem Sie SQL und XQuery kombinieren. –

Antwort

1

Kombinieren CTE mit ROW_NUMBER:

SELECT * FROM 
(
SELECT ROW_NUMBER() OVER() N,X.* 
FROM XMLTABLE ('$cust/customerinfo/phone' PASSING 
XMLPARSE(CLOB('<customerinfo Cid="1003"> 
    <name>Robert Shoemaker</name> 
    <addr country="Canada"> 
    <street>1596 Baseline</street> 
    <city>Aurora</city> 
    <prov-state>Ontario</prov-state> 
    <pcode-zip>N8X 7F8</pcode-zip> 
    </addr> 
    <phone type="work">905-555-7258</phone> 
    <phone type="home">416-555-2937</phone> 
    <phone type="cell">905-555-8743</phone> 
    <phone type="cottage">613-555-3278</phone> 
</customerinfo>')) as "cust" 
    COLUMNS 
    "PHONETYPE" CHAR(30) PATH '@type', 
    "PHONENUM" CHAR(15) PATH '.' 
) as X 
) AS phones 
WHERE 
N=4 
+0

Es wurde keine berechtigte Routine namens "XMLPARSE" vom Typ "FUNCTION" mit kompatiblen Argumenten gefunden. SQLCODE = -440, SQLSTATE = 42884, DRIVER = 4.19.26 SQL-Code: -440, SQL-Status: 42884 –