В Oracle 11g значение родительского тега не выбирается в наборе результатов, если для него нет вложенного тега в документе XML - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть вложенный 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, если дочерний тег отсутствует.

1 Ответ

0 голосов
/ 25 сентября 2018

Это потому, что вы делаете 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, но без него оно не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...