我有嵌套的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的父标记值。
答案 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
,但是没有它就无法正常工作。