2016-06-20 11 views
0

Ich brauche Hilfe beim Extrahieren der in einer CLOB-Spalte gespeicherten Daten. Ich möchte die CLOB-Daten in strukturierte Spalten und Zeilen konvertieren. SpaltendatenExtrahieren von Daten aus XML, die als CLOB gespeichert sind

CLOB:

<questions version="1"> 
<fld code="ADV" vis="Y"><oriVal></oriVal><curVal>N</curVal></fld> 
<fld code="ASEN1" vis="Y"><oriVal></oriVal><curVal>N</curVal></fld> 
<fld code="COGN" vis="Y"><oriVal></oriVal><curVal>A</curVal></fld> 
<fld code="`enter code here`COM" vis="Y"><oriVal></oriVal></fld> 
<fld code="COMORBID" vis="Y"><oriVal></oriVal><curVal>1</curVal></fld> 
<fld code="DIET" vis="Y"><oriVal></oriVal><curVal>R</curVal></fld> 
<fld code="DIS" vis="Y"><oriVal></oriVal></fld> 
<fld code="DISC" vis="Y"><oriVal></oriVal><curVal></curVal></fld> 
<fld code="DISC1" vis="Y"><oriVal></oriVal><curVal></curVal></fld> 
<fld code="DISC2" vis="Y"><oriVal></oriVal><curVal></curVal></fld> 
<fld code="DNR" vis="Y"><oriVal></oriVal><curVal>N</curVal></fld> 
<fld code="ER" vis="Y"><oriVal></oriVal><curVal>1</curVal></fld> 
</questions>  

Ich mag würde die Daten als

CODE  VALUE (curVal) 
---------- -------------- 
ADV   N 
ASEN1  N 
COGN  Y 
COMORBID 1 

Ich habe versucht, laufen mehrere Abfragen, um zu sehen, konnte aber nicht das gewünschte Ergebnis erzielen.

SELECT EXTRACTVALUE(xmltype(QUESTIONXML), '/questions/fld/oriVal/curVal[@code="ADV"]') 
FROM pac_copy.questionnaire; 

SELECT EXTRACTVALUE(QUESTIONXML, '/questions/fld') FROM pac_copy.questionnaire; 

SELECT XMLTYPE(u.QUESTIONXML).EXTRACT('/questions/fld/text()') as SORTCODE 
FROM pac_copy.questionnaire u; 

Antwort

0

Sie können XMLTable() für diesen Einsatz:

select x.code, x.curval 
from questionnaire q 
cross join xmltable('/questions/fld' 
    passing xmltype(q.questionxml) 
    columns code varchar2(10) path '@code', 
    curval varchar2(10) path '/curVal' 
) x; 

CODE  CURVAL 
---------- ---------- 
ADV  N   
ASEN1  N   
COGN  A   
COM     
COMORBID 1   
DIET  R   
DIS     
DISC     
DISC1     
DISC2     
DNR  N   
ER   1   

Sie können auswählen, wenn Sie auf bestimmte Codes beschränken wollen, oder nur diejenigen mit Werten gesetzt; mit einem WAK Ihren String-Wert bieten:

with questionnaire (questionxml) as (
    select '<questions version="1"> 
<fld code="ADV" vis="Y"><oriVal></oriVal><curVal>N</curVal></fld> 
<fld code="ASEN1" vis="Y"><oriVal></oriVal><curVal>N</curVal></fld> 
<fld code="COGN" vis="Y"><oriVal></oriVal><curVal>A</curVal></fld> 
<fld code="COM" vis="Y"><oriVal></oriVal></fld> 
<fld code="COMORBID" vis="Y"><oriVal></oriVal><curVal>1</curVal></fld> 
<fld code="DIET" vis="Y"><oriVal></oriVal><curVal>R</curVal></fld> 
<fld code="DIS" vis="Y"><oriVal></oriVal></fld> 
<fld code="DISC" vis="Y"><oriVal></oriVal><curVal></curVal></fld> 
<fld code="DISC1" vis="Y"><oriVal></oriVal><curVal></curVal></fld> 
<fld code="DISC2" vis="Y"><oriVal></oriVal><curVal></curVal></fld> 
<fld code="DNR" vis="Y"><oriVal></oriVal><curVal>N</curVal></fld> 
<fld code="ER" vis="Y"><oriVal></oriVal><curVal>1</curVal></fld> 
</questions>' from dual 
) 
select x.code, x.curval 
from questionnaire q 
cross join xmltable('/questions/fld' 
    passing xmltype(q.questionxml) 
    columns code varchar2(10) path '@code', 
    curval varchar2(10) path '/curVal' 
) x 
where x.curval is not null; 

CODE  CURVAL 
---------- ---------- 
ADV  N   
ASEN1  N   
COGN  A   
COMORBID 1   
DIET  R   
DNR  N   
ER   1   

Read more about using XQuery with XML data.

+0

Vielen Dank für die Hilfe alex, ich habe diese Abfrage früher versucht - mir fehlte die xmltype-Funktion. –