Извлечение данных из столбца Postgres XML с использованием XPath - PullRequest
1 голос
/ 25 апреля 2019

У меня есть такие данные XML в моей таблице postgres

<?xml version="1.0" encoding="UTF-8"?>
<Mydata>
   <LogNumber>10000</LogNumber>
   <LicenseNumber>XEU895</LicenseNumber>
   <LineCode>
      <V Idx="1">A</V>
      <V Idx="2">B</V>
      <V Idx="3">C</V>
      <V Idx="4">D</V>
   </LineCode>
   <OptionNo>
      <V Idx="1">999</V>
      <V Idx="2">27049</V>
      <V Idx="3">27049</V>
      <V Idx="4">999</V>
   </OptionNo>
</Mydata>

Используя запрос Xpath, я хочу выбрать такие данные.

LogNumber   LicenseNumber   LineCode    OptionNo
10000         XEU895            A           999
10000         XEU895            B           27049
10000         XEU895            C           27049
10000         XEU895            D           999

Я пробовал так много запросов XPath, но все они дают мне только одно значение из узлов LineCode и OptionNo . Так что любая помощь приветствуется

1 Ответ

1 голос
/ 25 апреля 2019

Функция xpath() возвращает массив значений XML. Используйте unnest(), чтобы получить элементы массивов, возвращаемых функцией, примененной к узлам, указанным первым аргументом xpath:

with t(x) as ( 
values (
    '<?xml version="1.0" encoding="UTF-8"?>
    <Mydata>
       <LogNumber>10000</LogNumber>
       <LicenseNumber>XEU895</LicenseNumber>
       <LineCode>
          <V Idx="1">A</V>
          <V Idx="2">B</V>
          <V Idx="3">C</V>
          <V Idx="4">D</V>
       </LineCode>
       <OptionNo>
          <V Idx="1">999</V>
          <V Idx="2">27049</V>
          <V Idx="3">27049</V>
          <V Idx="4">999</V>
       </OptionNo>
    </Mydata>'::xml)
)

select 
    (xpath('./LogNumber/text()', x))[1] as "LogNumber",
    (xpath('./LicenseNumber/text()', x))[1] as "LicenseNumber",
    unnest(xpath('./LineCode/V/text()', x)) as "LineCode",
    unnest(xpath('./OptionNo/V/text()', x)) as "OptionNo"
from t

 LogNumber | LicenseNumber | LineCode | OptionNo 
-----------+---------------+----------+----------
 10000     | XEU895        | A        | 999
 10000     | XEU895        | B        | 27049
 10000     | XEU895        | C        | 27049
 10000     | XEU895        | D        | 999
(4 rows)

Играйте с ним в Db-fiddle.

...