首页 > 解决方案 > 在 Oracle 11g 中,如果 XML 文档中没有嵌套标记,则不会在结果集中选择父标记值

问题描述

我有嵌套的 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

在这里我得到以下结果: 没有父标签值的结果

这里 entityLabel 字段的值没有选择没有子标签的父标签。如果不存在子标签,请帮助我如何解析提到的 xml 文档以选择具有子值 null 的父标签值。

标签: xmloracle

解决方案


这是因为您正在执行INNER JOINon 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,但没有它就无法正常工作。


推荐阅读