2016-11-29 72 views
0

我想查詢一個XMLType條件返回。
我的XML查詢:oracle XMLTABLE條件返回

with tab as (
select XMLType(
'<Obj name="Job" id="1"> 
    <Steps> 
     <StepType2> 
      <StepOptions> 
       <Attribute name="attr1" value="val1"/> 
       <Attribute name="attr2" value="val2"/> 
       <Attribute name="attr3" value="val3"/> 
      </StepOptions> 
     </StepType2> 
     <StepType1 type="flow" name="flowval" id="103"/> 
     <StepType1 type="data" name="dataval" id="104"/> 
     <StepType2> 
      <StepOptions> 
       <Attribute name="attr1" value="val5"/> 
       <Attribute name="attr2" value="val6"/> 
      </StepOptions> 
     </StepType2> 
    </Steps> 
</Obj>') as xmldata 
    from dual 
) 
select x.* 
    from tab, 
     XMLTable('for $i in $XmlData//* 
        return $i' 
        PASSING xmldata as "XmlData" 
        COLUMNS node VARCHAR2(2000) PATH 'name()', 
          name VARCHAR2(2000) PATH '@name', 
          id VARCHAR2(2000) PATH '@id' 
       ) x 

我做XML DB的Oracle,XPATH等等太多的搜索,但我找不到任何想法如何實現我的目標。

基本上我想要實現這個什麼樣的結果:
enter image description here

  • 顯示所有步驟的元素與他們的根的父母,在這種情況下根本是「的OBJ」
  • 如果節點名稱=「StepType2」,那麼
    爲ATTR_NAME領域獲得價值如果僅僅是name =爲ATTR_VAL字段獲取值 'attR1位' 和
    如果僅僅是name = 'attR2位'
  • 如果節點名稱= 'StepType1',那麼它的很多SIMP樂ATTR_NAME = @type, ATTR_VAL = @名稱和ATTR_ID = @ ID

我不知道,即使它是可能的,但任何主意,開始將是巨大的?

回答

1

您可以通過交叉加入步驟類型個XML到主用個XML工會所有,像這樣做:

with tab as (
select XMLType(
'<Obj name="Job" id="1"> 
    <Steps> 
     <StepType2> 
      <StepOptions> 
       <Attribute name="attr1" value="val1"/> 
       <Attribute name="attr2" value="val2"/> 
       <Attribute name="attr3" value="val3"/> 
      </StepOptions> 
     </StepType2> 
     <StepType1 type="flow" name="flowval" id="103"/> 
     <StepType1 type="data" name="dataval" id="104"/> 
     <StepType2> 
      <StepOptions> 
       <Attribute name="attr1" value="val5"/> 
       <Attribute name="attr2" value="val6"/> 
      </StepOptions> 
     </StepType2> 
    </Steps> 
</Obj>') as xmldata 
    from dual 
), 
    main_xml AS (SELECT mx.root_type, 
         mx.root_name, 
         mx.steptype1, 
         mx.steptype2 
       FROM tab 
         CROSS JOIN XMLTABLE('/*' PASSING tab.xmldata 
              COLUMNS root_type VARCHAR2(50) PATH 'name(.)', 
                root_name VARCHAR2(50) PATH '@name', 
                steptype1 XMLTYPE PATH '//StepType1', 
                steptype2 XMLTYPE PATH '//StepType2') mx) 
SELECT mx.root_type, 
     mx.root_name, 
     st1.attr_name, 
     st1.attr_val, 
     st1.attr_id 
FROM main_xml mx 
     CROSS JOIN XMLTABLE('/StepType1' PASSING mx.steptype1 
          COLUMNS attr_name VARCHAR2(50) PATH '@type', 
            attr_val VARCHAR2(30) PATH '@name', 
            attr_id INTEGER PATH '@id') st1 
UNION ALL 
SELECT mx.root_type, 
     mx.root_name, 
     st2.attr_name, 
     st2.attr_val, 
     NULL attr_id 
FROM main_xml mx 
     CROSS JOIN XMLTABLE('/StepType2' PASSING mx.steptype2 
          COLUMNS attr_name VARCHAR2(30) PATH '//Attribute[@name="attr1"]/@value', 
            attr_val VARCHAR2(30) PATH '//Attribute[@name="attr2"]/@value', 
            attr_id INTEGER PATH '@id') st2; 

導致:

ROOT_TYPE ROOT_NAME ATTR_NAME ATTR_VAL ATTR_ID 
--------- --------- --------- -------- ---------- 
Obj  Job  flow  flowval   103 
Obj  Job  data  dataval   104 
Obj  Job  val1  val2  
Obj  Job  val5  val6  
+0

太感謝你了.. – Deniz