2015-06-17 52 views
0

原諒我是一個初學者。如何通過屬性從XMLTYPE字段提取數據?

我正在查看名爲FORM_XML的列,它被描述爲數據類型XMLTYPE一個字段的內容是:

<Form FormID="0" Name="Preventive Care(F)"> 
    <FormObject Name="prevcare01" Type="DateTime" Label="Physical Exam" EditValue="04/05/2007" /> 
    <FormObject Name="prevcare02" Type="DateTime" Label="Lipid Profile" EditValue="NoEditValue" /> 
    <FormObject Name="prevcare03" Type="DateTime" Label="Health Care Proxy review" EditValue="NoEditValue" /> 
    <FormObject Name="prevcarecomm" Type="Text" Label="Comments" EditValue="NoEditValue" /> 
</Form> 

的目標是提取EditValue日期地方Label="Physical exam"。在這個例子中,我想提取日期04/05/2007。有沒有可以實現這一點的神奇查詢?

現有問題沒有幫助,因爲他們的XML數據結構不同。我的XML數據結構是否錯誤,因爲它不包含名稱空間和特定標籤?

後續問題: 我跑

SELECT Extract(form_xml, '/Form/FormObject/@EditValue') FROM patient_form; 

,並得到了EditValue爲連接在一起的所有FormObjects。是否有可能過濾掉EditValue其中Label="Physical exam"

回答

1

您可以使用XMLTABLE將XML轉換爲行和列,然後應用您的過濾器。

查詢:

SQL> with x(y) as (
    select xmltype('<Form FormID="0" Name="Preventive Care(F)"> 
    <FormObject Name="prevcare01" Type="DateTime" Label="Physical Exam" EditValue="04/05/2007" /> 
    <FormObject Name="prevcare02" Type="DateTime" Label="Lipid Profile" EditValue="NoEditValue" /> 
    <FormObject Name="prevcare03" Type="DateTime" Label="Health Care Proxy review" EditValue="NoEditValue" /> 
    <FormObject Name="prevcarecomm" Type="Text" Label="Comments" EditValue="NoEditValue" /> 
</Form>') from dual 
) 
select z.* 
from x cross join 
xmltable('Form/FormObject' passing x.y 
     columns label_ varchar2(30) path '@Label', 
       editvalue_ varchar2(30) path '@EditValue' 
     ) z 
where z.label_ = 'Physical Exam'; 

結果:

LABEL_       EDITVALUE_ 
------------------------------ ------------------------------ 
Physical Exam     04/05/2007 

或者使用XQuery轉換行和列前對其進行過濾。

查詢:

SQL> with x(y) as (
    select xmltype('<Form FormID="0" Name="Preventive Care(F)"> 
    <FormObject Name="prevcare01" Type="DateTime" Label="Physical Exam" EditValue="04/05/2007" /> 
    <FormObject Name="prevcare02" Type="DateTime" Label="Lipid Profile" EditValue="NoEditValue" /> 
    <FormObject Name="prevcare03" Type="DateTime" Label="Health Care Proxy review" EditValue="NoEditValue" /> 
    <FormObject Name="prevcarecomm" Type="Text" Label="Comments" EditValue="NoEditValue" /> 
</Form>') from dual 
) 
select z.* 
from x cross join 
xmltable('for $i in /Form/FormObject 
       where $i/@Label = "Physical Exam" 
       return $i' passing x.y 
     columns label_ varchar2(30) path '@Label', 
       editvalue_ varchar2(30) path '@EditValue' 
     ) z; 

結果:

LABEL_       EDITVALUE_ 
------------------------------ ------------------------------ 
Physical Exam     04/05/2007 
+0

你是最棒的。謝謝! –

0

命名空間通常會讓生活變得複雜,沒有命名空間應該更簡單。

/Form/FormObject/@EditValue 
+0

嗨,我有一個後續的問題,可以使用一些幫助。有什麼建議麼? –

相關問題