如何在PostgreSQL中从XML查询同级节点

时间:2019-04-20 23:21:22

标签: xml postgresql postgresql-10

我在PostgreSQL的 my_table 设置列中存储了一些XML。 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从 type 节点中获取值:

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从 Input Output 节点中获取值:

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

但是,我无法弄清楚如何从具有所有 Input Output 节点的各个 type 节点中选择值 ReplacementSet 节点中的值。

我尝试过的所有内容都出错了,包括了 type 值,但 Input Output 为空,或者类型输入输出节点的值。

1 个答案:

答案 0 :(得分:2)

这不是问题,但是您必须为“类型”列明确指定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)