PostgreSQL xpath选择将其子日期属性作为最新的元素

时间:2016-01-13 11:13:12

标签: xml postgresql xpath

我在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树中的第一个元素。

1 个答案:

答案 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)