2011-09-06 102 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