2010-08-11 70 views
17

我在postgresql中有一个表。下表“动物”会做解释我的问题:对在postgresql中使用array_agg创建的文本聚合进行排序

name 
------ 
tiger 
cat 
dog 

现在,我使用下面的查询:

SELECT 
    array_to_string(array_agg("name"), ', ') 
FROM 
    animals; 

结果是:“老虎,猫,狗”。但是我想在汇总到一个字符串之前对它进行排序。所以这是我希望的结果:

"cat, dog, tiger". 

那么,如何可以将其转换为字符串之前排序中的PostgreSQL 8.4的字符串数组。行“name”上的ORDER BY不起作用,内置的排序函数只处理整数值。

任何人都是一个好主意,如何在纯SQL中解决这个问题?

感谢名单了很多 理查德

回答

11

这将在PostgreSQL的9.0是可用:

http://www.postgresql.org/docs/9.0/static/release-9-0.html,第E.1.3.6.1。聚集

在此期间,你可以做这样的事情可以解决这个问题(虽然笨拙):

SELECT array_agg(animal_name) 
FROM (
    SELECT "name" AS animal_name 
    FROM animals 
    ORDER BY "name" 
) AS sorted_animals; 
+0

这会做!很高兴知道它将在9.0中实施。 – Richard 2010-08-11 20:16:29

0

您是否尝试过在阵列上使用generate_series(),然后执行该结果一SELECT...ORDER BY(或只是巢它SELECT内部)将其转换为字符串之前?

+0

我刚嵌套它。子选择做了我需要的魔法。 – Richard 2010-08-11 20:42:20

3

虽然马修·伍德的回答是对你的情况比较好,这里是一个办法阵列中排序PostgreSQL的8.4及以上:

SELECT array(
    SELECT unnest(array[3,2,1]) AS x ORDER BY x 
); 

知道了arrayunnest功能,可以很方便的,因为它也可以让你做的事情一样"map"一个数组:

SELECT array(
    SELECT x*x FROM (SELECT unnest(array[1,2,3]) AS x) as subquery 
); 

再次,这可以是你的PostgreSQL 8.4的价格。

+0

我会牢记一个很好的解决方法。非常感谢你。 – Richard 2010-08-11 20:41:19

39

PostgreSQL 9.0 and later,您可以在聚合表达式中使用ORDER BY条款:

SELECT 
    array_to_string(array_agg(name ORDER BY name), ', ') 
FROM 
    animals; 

此外,为您的特定目的,你可以使用string_agg简化您的查询:

SELECT 
    string_agg(name, ', ' ORDER BY name) 
FROM 
    animals; 
+0

感谢您的提示! – Richard 2011-09-23 06:29:36

0

尽管如此,对于版本8.4,使用Matthew Wood建议的解决方案,如果您需要在外部查询中进行分组,则内部查询也应该排序,以便排序保持一致。

SELECT family, array_agg(animal_name) 
FROM (
    SELECT family, "name" AS animal_name 
    FROM animals 
    ORDER BY family, "name" 
) AS sorted_animals 
group by family; 
相关问题