2016-01-13 80 views
1

我在postgreSQL中有一個表歷史記錄(id int,content xml)。其中一個id的XML內容如下PostgreSQL xpath選擇具有它最近的孩子日期屬性的元素

<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

您需要投下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) 
+0

感謝。這解決了我的問題。 –