【问题标题】:oracle XMLTABLE conditional returnoracle XMLTABLE 条件返回
【发布时间】:2017-04-13 06:14:00
【问题描述】:

我正在尝试查询 XMLType 以获得条件返回。
我的 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
)
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 等上进行了太多搜索,但我不知道如何实现我的目标。

基本上我想要达到这个结果:

  • 显示所有 Steps 元素及其根父级,在本例中,根为 'Obj'
  • 如果节点名称 = 'StepType2' 那么
    如果只有 name = 'attr1' 和
    ,则 ATTR_NAME 字段获取值 如果只有 name = 'attr2',则 ATTR_VAL 字段获取值
  • 如果节点名称 = 'StepType1' 那么其简单的 ATTR_NAME = @type, ATTR_VAL=@name 和 ATTR_ID=@id

我不知道是否有可能,但任何开始的想法都会很棒?

【问题讨论】:

    标签: xml oracle11g xmltable


    【解决方案1】:

    您可以通过使用 union all 将 steptype xmls 交叉连接到主 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     
    

    【讨论】:

      猜你喜欢
      • 2017-06-01
      • 2017-12-06
      • 1970-01-01
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      • 2021-10-02
      相关资源
      最近更新 更多