Как запросить узлы-братья из XML в PostgreSQL - PullRequest
1 голос
/ 21 апреля 2019

У меня есть некоторый XML, хранящийся в столбце settings в my_table в PostgreSQL.XML похож на это:

<Dictionary>
  <ExportValues>
    <ReplacementSet>
      <type>TEST_CODE</type>
      <ReplacementPair>
        <Input>A1</Input>
        <Output>One</Output>
      </ReplacementPair>
      <ReplacementPair>
        <Input>A2</Input>
        <Output>Two</Output>
      </ReplacementPair>
      <ReplacementPair>
        <Input>A3</Input>
        <Output>Three</Output>
      </ReplacementPair>
    </ReplacementSet>
    <ReplacementSet>
      <type>TEST_TYPE</type>
      <ReplacementPair>
        <Input>MTL</Input>
        <Output>Metal</Output>
      </ReplacementPair>
      <ReplacementPair>
        <Input>LQD</Input>
        <Output>Liquid</Output>
      </ReplacementPair>
      <ReplacementPair>
        <Input>SLD</Input>
        <Output>Solid</Output>
      </ReplacementPair>
    </ReplacementSet>
  </ExportValues>
</Dictionary>

Я пытаюсь получить следующий вывод:

type, Input, Output
TEST_CODE, A1, One
TEST_CODE, A2, Two
TEST_CODE, A3, Three
TEST_TYPE, MTL, Metal
TEST_TYPE, LQD, Liquid
TEST_TYPE, SLD, Solid

Я могу получить значения из типа узел со следующим SQL:

select xxx.*
  from xmltable('/Dictionary/ExportValues/ReplacementSet'
                passing xml((select settings
                               from my_table
                              limit 1))
                columns replacement_value_type text path 'type') xxx

И я могу получить значения из Входных и Выходных узлов со следующим SQL:

select xxx.*
  from xmltable('/Dictionary/ExportValues/ReplacementSet/ReplacementPair'
                passing xml((select settings
                               from web_service
                              limit 1))
                columns our_value text path 'OurValue',
                        their_value text path 'TheirValue') xxx

Однако я не могу понять, как выбрать значение из соответствующих узлов type со всеми значениями узлов Input и Output в узлах ReplacementSet .

Все, что я пробовал, либо содержало ошибку, включая значения type , но нули для Input и Вывод или нули для типа и значения для Входных и Выходных узлов.

1 Ответ

2 голосов
/ 21 апреля 2019

Это не проблема, но вы должны явно указать XPath для столбца типа:

select x.* 
  from my_table, 
       xmltable('/Dictionary/ExportValues/ReplacementSet/ReplacementPair'
                passing settings 
                columns
                  type text path '../type', 
                  input text path 'Input', 
                  output text path 'Output') x;

+-----------+-------+--------+
|   type    | input | output |
+-----------+-------+--------+
| TEST_CODE | A1    | One    |
| TEST_CODE | A2    | Two    |
| TEST_CODE | A3    | Three  |
| TEST_TYPE | MTL   | Metal  |
| TEST_TYPE | LQD   | Liquid |
| TEST_TYPE | SLD   | Solid  |
+-----------+-------+--------+
(6 rows)
...