我有一张这样的桌子

Movie   Actor   
  A       1
  A       2
  A       3
  B       4

我想要得到一部电影的名字和这部电影中的所有演员,我希望结果是这样的格式:

Movie   ActorList
 A       1, 2, 3

我该怎么做呢?


你可以使用array_agg函数:

SELECT "Movie",
array_to_string(array_agg(distinct "Actor"),',') AS Actor
FROM Table1
GROUP BY "Movie";

结果:

MOVIE ACTOR
A 1,2,3
B 4

看这个SQLFiddle

更多信息请参见9.18。聚合函数


使用聚合函数string_agg()更简单(Postgres 9.0或更高版本):

SELECT movie, string_agg(actor, ', ') AS actor_list
FROM   tbl
GROUP  BY 1;

GROUP BY 1中的1是一个位置引用,在本例中是GROUP BY电影的快捷方式。

String_agg()期望数据类型文本作为输入。其他类型需要显式强制转换(actor::text)——除非定义了隐式强制转换为文本——所有其他字符串类型(varchar, character, name,…)和其他一些类型都是这种情况。

正如isapir所评论的,如果需要的话,可以在聚合调用中添加ORDER BY子句来获得一个排序的列表。如:

SELECT movie, string_agg(actor, ', ' ORDER BY actor) AS actor_list
FROM   tbl
GROUP  BY 1;

但是对子查询中的行进行排序通常更快。看到的:

在SELECT中创建数组