2011-09-06 92 views
52

表 '動物':PostgreSQL的ARRAY_AGG爲了

animal_name animal_type 
Tom   Cat 
Jerry  Mouse 
Kermit  Frog 

查詢:

SELECT 
array_to_string(array_agg(animal_name),';') animal_names, 
array_to_string(array_agg(animal_type),';') animal_types 
FROM animals; 

預期結果:

Tom;Jerry;Kerimt, Cat;Mouse;Frog 
OR 
Tom;Kerimt;Jerry, Cat;Frog;Mouse 

我可以肯定的說爲了在第一聚合函數總是會與第二個相同。 我的意思是我我就不會想獲得:

Tom;Jerry;Kermit, Frog;Mouse,Cat 
+6

如果你在9.0上,你可以用一個'string_agg()' –

回答

20

如果你是一個PostgreSQL版本< 9.0則:

來源:http://www.postgresql.org/docs/8.4/static/functions-aggregate.html

在當前實現中,輸入的順序原則上未指定。但是,通過排序子查詢提供輸入值通常會起作用。例如:

SELECT xmlagg(x)FROM(SELECT x FROM test ORDER BY y DESC)AS選項卡;

所以你的情況,你可以這樣寫:

SELECT 
array_to_string(array_agg(animal_name),';') animal_names, 
array_to_string(array_agg(animal_type),';') animal_types 
FROM (SELECT animal_name, animal_type FROM animals) AS x; 

輸入到ARRAY_AGG隨後將是無序的,但它會在兩列相同。如果你喜歡,你可以添加一個ORDER BY子句的子查詢。

+0

我曾想過這個,但當它發現越野車我發現順序通過子查詢奇怪不工作https://stackoverflow.com/questions/16248813/is-order-in-一,子查詢,保證要被保存完好 – Adamantish

171

使用ORDER BY,就像從manual這個例子:

SELECT array_agg(a ORDER BY b DESC) FROM table; 
+25

替換嵌套的調用。注意:'array_agg'中的'ORDER BY'在PostgreSQL中引入9 – UlfR

+4

比假設PostgreSQL 9+的接受答案好得多。 – Erik

+1

您可以給樣品提供ORDER BY以供選擇: SELECT array_agg(animal_name),array_agg(animal_type)FROM animals; ? – GKislin