Извлечение уникальных атрибутов элементов XML с помощью postgresql - PullRequest
0 голосов
/ 14 октября 2019

Учитывая этот тип данных xml в базе данных postgresql:

<parent>
  <boy age="12">Joe</child>
  <boy age="13">John</child>
  <boy age="12">Jimmy</child>
  <girl age="13">John</child>
  <girl age="11">Jimmy</child>

</parent>

Как извлечь уникальные атрибуты всех дочерних элементов?

Это то, что я сделал до сих пор:SELECT unnest(xpath('(//boy|girl)/@age', col_name)) from table;

Возвращает это:

unnest
12
13
12
13
11

Я бы хотел вернуть только 11,12,13. Итак, мой следующий шаг - попробовать DISTINCT. Я искал в интернете и пробовал несколько вещей, но это, похоже, не работает:

Метод 1 SELECT DISTINCT unnest(xpath('(//boy|girl)/@age', col_name)) from table; Я получаю эту ошибку: не удалось определить оператор равенства для типа xml

Метод 2 - использование подзапроса - Я думал, что это должен быть ответ. Я запускаю запрос, который возвращает таблицу со всеми атрибутами. Затем я запускаю выборочный отчет для этой таблицы следующим образом:
SELECT DISTINCT * from (SELECT unnest(xpath('(//a|b|c)/@z', data)) from test3) as x;

Я все еще получаю ту же ошибку: не удалось идентифицировать оператор равенства для типа xml

У меня также естьпопробовал это:
SELECT DISTINCT x from (SELECT unnest(xpath('(//a|b|c)/@z', data)) from test3) as x;

Я не могу определить функцию сравнения для типа xml.

Оцените любую помощь!

1 Ответ

1 голос
/ 14 октября 2019

Вы можете преобразовать результат вашего xpath в текст или текст, а затем в int:

SELECT DISTINCT unnest(xpath('(//boy|girl)/@age', col_name))::text::int from table;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...