我在PostgreSQL中有一个表history(id int,content xml)。其中一个id的XML内容如下:
这里,我想获取姓氏及其对应的执行日期。对于上面的例子,我想要以下输出。
我能够使用以下的SQL查询生成所有可能的组合,但无法获得与上述输出相同的结果。
任何关于如何完成这件事的建议吗?
<history-data>
<history recorded-date="20110601">
<assignees>
<assignee>
<last-name>CIENA LUXEMBOURG</last-name>
</assignee>
</assignees>
<assignors>
<assignor execution-date="20110517">
<last-name>NORTEL NETWORKS LIMITED</last-name>
</assignor>
</assignors>
</history>
<history recorded-date="20110601">
<assignees>
<assignee>
<last-name>CIENA CORPORATION</last-name>
</assignee>
</assignees>
<assignors>
<assignor execution-date="20110527">
<last-name>CIENA LUXEMBOURG</last-name>
</assignor>
</assignors>
</history>
<history recorded-date="20090430">
<assignees>
<assignee>
<last-name>NORTEL NETWORKS</last-name>
</assignee>
</assignees>
<assignors>
<assignor execution-date="20090424">
<last-name>MAK, GARY</last-name>
</assignor>
<assignor execution-date="20090424">
<last-name>VELEZ, EDGAR</last-name>
</assignor>
</assignors>
</history>
</history-data>
这里,我想获取姓氏及其对应的执行日期。对于上面的例子,我想要以下输出。
last-name execution-date
================ ==============
CIENA LUXEMBOURG 20110517
CIENA CORPORATION 20110527
NORTEL NETWORKS 20090424
我能够使用以下的SQL查询生成所有可能的组合,但无法获得与上述输出相同的结果。
SELECT id, unnest(CAST(xpath('/history-data/history/assignees/assignee/last-name/text()',content) AS text)::text[]) AS last-name,
unnest(CAST(xpath('/history-data/history/assignors/assignor/@execution-date',content) AS text)::text[]) AS execution-date
FROM history
WHERE id = 10
任何关于如何完成这件事的建议吗?
assignee
条目时,只需使用unnest()
即可。 - Dmitry S