我在postgreSQL中有一个表历史记录(id int,content )。其中一个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公司、,因为它的执行日期是最近的。
我能够用下面的代码获得第一个子元素,但无法获得具有最近执行日期的元素。
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树中的第一个元素。
发布于 2016-01-13 11:46:37
您需要强制转换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)https://stackoverflow.com/questions/34765175
复制相似问题