我在postgreSQL中有一个表历史(id int,content xml)。其中一个id的XML内容如下
<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>
在这里,我想获得执行日期最近的姓氏。在这种情况下,我希望输出为 CIENA CORPORATION ,因为它的执行日期是最近的。
我能够使用以下代码获得第一个孩子,但无法获得具有最近执行日期的元素
SELECT id, unnest(CAST(xpath('/history-data/history/assignees[1]/assignee/last-name/text()',content) AS text)::text[]) AS last-name
FROM history
WHERE id = 10
关于我该怎么做的任何想法?如果有多个元素具有相同的执行日期,那么我想要xml树中的第一个元素。
答案 0 :(得分:1)
您需要投放to_date()
个选定的execution-date
文字值,并使用ORDER BY execution-date LIMIT 1
获取最新的文本值;样本查询:
SELECT
unnest(xpath('//assignee/last-name/text()',xml_element)) AS "last-name",
to_date(unnest(xpath('//assignor/@execution-date',xml_element))::TEXT,'YYYYMMDD') AS "execution-date"
FROM (
SELECT unnest(xpath('//history',content)) AS xml_element FROM history
WHERE id = 10
) t
ORDER BY "execution-date" DESC LIMIT 1;
输出:
last-name | execution-date
-------------------+----------------
CIENA CORPORATION | 2011-05-27
(1 row)