在postgresql中对使用array_agg创建的文本聚合进行排序

时间:2010-08-11 18:10:18

标签: postgresql

我在postgresql中有一个表。下表“动物”将解释我的问题:

name
------
tiger
cat
dog

现在我使用以下查询:

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

结果是:“虎,猫,狗”。但我希望在将聚合转换为字符串之前对其进行排序。所以这是我希望的结果:

"cat, dog, tiger".

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

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

Thanx很多 理查德

6 个答案:

答案 0 :(得分:46)

对于现代PostgreSQL(自9.0版起),您可以使用ORDER BY clause in an aggregate expression

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

此外,出于特定目的,您可以使用string_agg来简化查询:

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

答案 1 :(得分:13)

这将在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;

答案 2 :(得分:4)

虽然Matthew Wood的答案对你的情况更好,但是这是一种在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的价格。

答案 3 :(得分:0)

您是否尝试在数组上使用generate_series(),然后在将结果转换为字符串之前对该结果执行SELECT...ORDER BY(或将其嵌套在SELECT内) ?

答案 4 :(得分: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;

答案 5 :(得分:0)

要对此问题进行更新,Snowflake已实现了数组排序:

SELECT
    array_sort(array_agg("name")
FROM
    animals;

还可以使用array_sort_by对对象进行排序