首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >oracle XMLTABLE条件返回

oracle XMLTABLE条件返回
EN

Stack Overflow用户
提问于 2016-11-29 09:51:32
回答 1查看 1.2K关注 0票数 0

我正在尝试查询一个XMLType以获得条件返回。

我的xml查询:

代码语言:javascript
复制
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、xPath等上做了太多的搜索,但是我找不到任何方法来实现我的目标。

基本上,我想要达到的结果是:

  • 显示带根父元素的所有步骤元素,在本例中,根元素为“Obj”
  • 如果节点名= 'StepType2‘那么 对于ATTR_NAME字段,如果只有name = 'attr1‘和 对于ATTR_VAL字段,如果只有名称= 'attr2‘,则获取值。
  • 如果节点名= 'StepType1‘,那么其简单得多的ATTR_NAME = @type、ATTR_VAL=@name和ATTR_ID=@id

我不知道这是否可能,但是有什么好的开始吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-29 10:43:33

您可以通过将步骤类型xml与主xml交叉连接到包含一个union all的xml,如下所示:

代码语言:javascript
复制
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;

其结果是:

代码语言:javascript
复制
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     
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40862673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档