2016-11-29 6 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オラクル、XPathとにあまりにも多くの検索を行うことが、私は私の目標を達成するためにどのように任意のアイデアを見つけることができませんでした。

基本的に私はこの結果を達成するために欲しいもの:ノード名は=「StepType2」の場合
enter image description here

  • 表示し、そのルートの親を持つすべてのステップの要素、この場合には根がし、 'objの
  • です名前だけ=「ATTR1」と
    場合のみ、名前は=「ATTR2」
  • 場合は、ノード名を=「StepType1」場合ATTR_NAMEフィールドの
    はそのくらいSIMPその後、ATTR_VALフィールドGET値の値を取得しますルATTR_NAME = @type、 ATTR_VAL = @名とATTR_ID = @ ID

は、私はそれが可能であっても知らないが、開始時に任意のアイデアは素晴らしいだろうね?

答えて

1

あなたは、クロスのすべての労働組合との主なXMLSにsteptypeのXMLSに参加することによってこれを行うことができ、そのよう:になり

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