我在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 为空,或者类型和输入和输出节点的值。
答案 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)