2016-04-05 8 views
0

Ich habe diese Tabelle in Oracle SQL Developer erstelltErster XML aus einer Tabelle in SQL erstellt

CREATE TABLE Test_T (
    COL_1 VARCHAR(30), 
    COL_2 XMLTYPE 
); 

Und haben diese eingefügt hinein

INSERT INTO Test_T VALUES ('two', ('<?xml version="1.0" encoding="UTF-8"?> 
<CATALOG> 
<PLANT> 
    <COMMON>Bloodroot</COMMON> 
    <BOTANICAL>Sanguinaria canadensis</BOTANICAL> 
    <ZONE>4</ZONE> 
    <LIGHT>Mostly Shady</LIGHT> 
    <PRICE>$2.44</PRICE> 
    <AVAILABILITY>031599</AVAILABILITY> 
</PLANT> 
<PLANT> 
    <COMMON>Columbine</COMMON> 
    <BOTANICAL>Aquilegia canadensis</BOTANICAL> 
    <ZONE>3</ZONE> 
    <LIGHT>Mostly Shady</LIGHT> 
    <PRICE>$9.37</PRICE> 
    <AVAILABILITY>030699</AVAILABILITY> 
</PLANT></CATALOG>')); 

Mein Ziel ist die < COMMON zurückzukehren> Name </GEMEINSAM> NUR WO die Zone 3 oder WENIGER ist. Also sollte dies Columbine zurückgeben.

Ich dachte über die Verwendung von XMLExists Ich bin nicht so vertraut mit XML, also das ist, was ich bisher hatte.

SELECT COL_2 FROM Test_T WHERE XMLExists('//ZONE[COL_2 <= 3]' PASSING BY REF COL_2); 

Ich bin mir nicht sicher, ob ich auf die ZONE richtig zugreife.

Könnte jemand mich in die richtige Richtung führen?

+0

Welche DBMS verwenden Sie? – eftpotrm

+0

@eftpotrm, Tut mir leid. Mit Oracle SQL Developer –

Antwort

1

Versuchen Sie, die folgenden Auswahlabfrage:

SELECT COMMON_NAME FROM Test_T WHERE XMLExists('CATALOG/PLANT[ZONE<=3]/COMMON[text()]' PASSING COMMON_NAME) 
+0

Das funktioniert, danke Mann! –

0

Das Problem mit Ihrem Weg ist ('//ZONE[COL_2 <= 3]'). COL_2 ist kein gültiger XML-Knoten, sondern nur der Name Ihrer Spalte.

Der richtige Pfad wäre //ZONE[text() <= 3].

text() ist eine spezielle Knotenreferenz, die Oracle anweist, den Text innerhalb des ZONE-Knotens <ZONE>THIS TEXT</ZONE> zu erfassen. Sie können nur Knoten in Ihrem tatsächlichen XML-Schema anvisieren.

Beachten Sie auch, dass der Pfad CASE SENSITIVE zu dem, was in Ihrem XML ist. Wenn Sie daran denken, sparen Sie Zeit.

Darüber hinaus wäre eine andere Möglichkeit, Ihre Auswahl zu schreiben. In diesem Beispiel führt Oracle einen impliziten Join durch und gibt eine Zeile für jede // PLANT mit/ZONE/text() < = 3 zurück. Der Pfad in der XMLSEQUENCE ist hier wichtig, da er bestimmt, wie Oracle jede Zeile aufteilt, also Sie kann nicht nur // ZONE als Ziel haben, da Sie nur eine Zeile für jede ZONE und nicht eine Zeile für jede ANLAGE erhalten würden.

In der SELECT-Klausel können Sie einzelne Knotenwerte für jede PLANT extrahieren, wenn Sie mehrere haben.

SELECT VALUE(P) --THE FULL XML FOR EACH PLANT 
    VALUE(P).EXTRACT('//COMMON/text()').getstringval() AS COMMON, --INDIVIDUAL NODE VALUE 
    VALUE(P).EXTRACT('//BOTANICAL/text()').getstringval() AS BOTANICAL --INDIVIDUAL NODE VALUE 
FROM Test_T, TABLE(XMLSEQUENCE(EXTRACT(COL_2, '//PLANT[ZONE<= 3]'))) p 
Verwandte Themen