我有一张这样的桌子
Movie Actor
A 1
A 2
A 3
B 4
我想要得到一部电影的名字和这部电影中的所有演员,我希望结果是这样的格式:
Movie ActorList
A 1, 2, 3
我该怎么做呢?
我有一张这样的桌子
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中创建数组