2016-06-20 4 views
0

Мне нужна помощь в извлечении данных, хранящихся в столбце CLOB. Я хотел бы преобразовать данные CLOB в структурированные столбцы и строки.Извлечь данные из XML, хранящихся в виде CLOB

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>  

Я хотел бы видеть данные, как

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

Я попытался запустить несколько запросов, но не смог добиться желаемого результата.

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; 

ответ

0

Вы можете использовать XMLTable() для этого:

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   

Вы можете выбирать, если вы хотите ограничить к определенным кодам, или только те, с множеством значений; с КТР, чтобы обеспечить вашу строковое значение:

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

Большое спасибо за всю помощь alex, я попробовал этот запрос раньше - мне не хватало функцию xmltype. –