XPath-запрос к иерархическим данным, сохраняющий связь предка и потомка - PullRequest
2 голосов
/ 22 ноября 2011

Как я могу выразить PostgreSQL, что я хочу значения одновременно из нескольких иерархических уровней в запросе XPath ?

У меня есть документ (в значении PostgreSQL XML) со значениеммногоуровневая иерархия.Для этого вопроса может быть создан пример с:

SELECT XMLPARSE(DOCUMENT '
    <parrots>
        <parrot name="Fred">
            <descriptor>Beautiful plumage</descriptor>
            <descriptor>Resting</descriptor>
        </parrot>
        <parrot name="Ethel">
            <descriptor>Pining for the fjords</descriptor>
            <descriptor>Stunned</descriptor>
        </parrot>
    </parrots>
    ') AS document
INTO TEMPORARY TABLE parrot_xml;

Я могу получить разные уровни информации из этого документа.

=> SELECT
        (XPATH('./@name', parrot.node))[1] AS name
    FROM (             
        SELECT
            UNNEST(XPATH('./parrot', parrot_xml.document))
                AS node
        FROM parrot_xml
        ) AS parrot
    ;
 name  
-------
 Fred
 Ethel
(2 rows)

=> SELECT
        (XPATH('./text()', descriptor.node))[1] AS descriptor
    FROM (
        SELECT
            UNNEST(XPATH('./parrot/descriptor', parrot_xml.document))
                AS node
        FROM parrot_xml
        ) AS descriptor
    ;
      descriptor       
-----------------------
 Beautiful plumage
 Resting
 Pining for the fjords
 Stunned
(4 rows)

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

=> SELECT
        ??? AS name,
        ??? AS descriptor
    FROM
        ???
    ;
 name         descriptor       
------- -----------------------
 Fred    Beautiful plumage     
 Fred    Resting               
 Ethel   Pining for the fjords 
 Ethel   Stunned               
(4 rows)

Как это можно сделать?Что должно идти вместо «???»?

Один сложный запрос XPath - но как обращаться к нескольким уровням одновременно?Несколько запросов XPath - но тогда как информация предка-потомка сохраняется для результирующего отношения?Что-то еще?

1 Ответ

4 голосов
/ 26 ноября 2011

Попробуйте это:

SELECT (xpath('./@name', parrot.node))[1] AS name
     , unnest(xpath('./descriptor/text()', parrot.node)) AS descriptor
FROM  (             
   SELECT unnest(xpath('./parrot', parrot_xml.document)) AS node
   FROM   parrot_xml
   ) parrot;

Создает точно запрошенный вывод.

Сначала в подзапросе я получаю целые узлы-попугаи.Один узел на строку.

Далее я получаю имя и дескрипторы с помощью xpath ().Оба являются массивами.Я беру первый (и единственный) элемент name и разделяю массив descriptor с помощью `unnest (), тем самым получая желаемый результат.

Я написал исчерпывающий ответ на связанныйвопрос недавно.Может быть интересным для вас.

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