我有一张这样的桌子
Movie Actor A 1 A 2 A 3 B 4
我想要得到一部电影的名字和这部电影中的所有演员,我希望结果是这样的格式:
Movie ActorList A 1, 2, 3
我该怎么做呢?
你可以使用array_agg函数来实现:
array_agg
SELECT "Movie", array_to_string(array_agg(distinct "Actor"),',') AS Actor FROM Table1 GROUP BY "Movie";
结果:
看到这SQLFiddle
更多信息请参见9.18. 聚合函数
使用聚合函数< >强string_agg() < / >强 (Postgres 9.0或更高版本)更简单:
string_agg()
SELECT movie, string_agg(actor, ', ') AS actor_list FROM tbl GROUP BY 1;
在本例中,GROUP BY 1中的1是位置引用,也是GROUP BY movie的快捷方式。
GROUP BY 1
1
GROUP BY movie
string_agg()期望数据类型text作为输入。其他类型需要显式强制转换(actor::text) - 除非定义了隐式强制转换为text -这是所有其他字符串类型(varchar, character, name,…)和其他一些类型的情况。
text
actor::text
varchar
character
name
作为isapir评论,你可以在聚合调用中添加一个ORDER BY子句来获得一个排序的列表——如果你需要的话。如:
ORDER BY
SELECT movie, string_agg(actor, ', ' ORDER BY actor) AS actor_list FROM tbl GROUP BY 1;
但是对子查询中的行进行排序通常更快。看到的: