2016-06-20 17 views
0

CLOB列に格納されたデータを抽出するのに役立つ必要があります。私は構造化された列と行にCLOBデータを変換したいと思います。CLOBとして格納されたXMLからデータを抽出する

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   

あなたが特定のコード、またはのみ設定された値を持つものに制限したい場合は、フィルタリングすることができます。あなたの文字列値を提供するCTEで:

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

ありがとう、すべてのヘルプアレックス、私はこのクエリを試してみました - 私はxmltype関数が不足していた。 –

関連する問題