xml - 在 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 的父标签值。
解决方案
这是因为您正在执行INNER JOIN
on 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
,但没有它就无法正常工作。
推荐阅读
- c# - 在两行中显示 div 元素,其中一行 4 个项目
- memory-leaks - 使用这样的高阶javascript函数是否存在内存泄漏?
- java - 更新 ArrayList 中 Array 的数组元素
- python - 使用 python 解析具有不同父键的 JSON 数据
- loops - Kotlin for 循环未在 Kotlin 脚本中打印
- excel - Office 2013 上的 SAS 插件 7.1,用于更新 powerpoint 幻灯片的 VBA 代码
- azure - ODBC 驱动程序和访问 Azure 登录的奇怪行为
- python - 为一个类实例预取多对多关系
- python - 如何更改数据框列中几个项目的名称
- python - 是否可以使用 dask.compute 将 dask.DataFrame.categorize 与另一个 dask 计算结合起来?