在Oracle 11g中,如果XML文档中没有嵌套标记,则不会在结果集中选择父标记值

时间:2018-09-25 18:30:23

标签: xml oracle

我有嵌套的xml文档。但是在某些地方没有嵌套。我尝试获取所有要插入表中的信息。但是,如果没有嵌套(子标记),则查询不会返回父标记值。如果不存在嵌套,我希望在带有父标记值的子标记处返回空值。下面是 代码以在表中创建数据

    create table xmldata as
with xmldoc as (
select xmlType('
    <detailedOutput>
    <entity>
        <entityLabel>Parent tag with child</entityLabel>
        <entityName>P with C</entityName>
        <entityType>P with C</entityType>
        <fact>
            <name>I am child 1</name>
        </fact>
        <fact>
            <name>I am child 2</name>
        </fact>
    </entity>
    <entity>
        <entityLabel>Parent tag with no child</entityLabel>
        <entityName>P with no C</entityName>
        <entityType>P with no C</entityType>
    </entity>
    </detailedOutput>
    ') xml from dual
)
select xml from xmldoc

选择结果的代码:

select
    extractValue (value(e), '/entity/entityLabel') as "entityLabel",
    extractValue (value(e), '/entity/entityName')  as "entityName",
    extractValue (value(e), '/entity/entityType')  as "entityType",
    extractValue (value(f), '/fact/name')          as "factName" 
from xmldata x,
    table (xmlSequence(extract(xml,      '/detailedOutput/entity'))) e,
    table (xmlSequence(extract(value(e), '/entity/fact'))) f

在这里,我得到以下结果: result without parent tag value

entityLabel字段的值没有子代的父标记未选中。如果没有子标记,请帮助我如何解析提到的xml文档以选择子标记为null的父标记值。

1 个答案:

答案 0 :(得分:1)

这是因为您正在INNER JOIN上进行f,这将删除所有没有事实/名称子级的实体。试试这个吧。

select 
    extractValue (value(e), '/entity/entityLabel') as "entityLabel",
    extractValue (value(e), '/entity/entityName')  as "entityName",
    extractValue (value(e), '/entity/entityType')  as "entityType",
    extractValue (value(f), '/fact/name')          as "factName" 
from xmldoc x
inner join table (xmlSequence(extract(xml,      '/detailedOutput/entity'))) e 
    on 1=1
left join table (xmlSequence(extract(value(e), '/entity/fact'))) f 
    on value(e) is not null

我不确定为什么f需要连接条件到e,但是没有它就无法正常工作。