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

jtoj6r0c  于 5个月前  发布在  PostgreSQL
关注(0)|答案(6)|浏览(89)

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

name
------
tiger
cat
dog

字符串
现在我使用以下查询:

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


结果是:“tiger,cat,dog”。但我想在将聚合转换为字符串之前对其进行排序。因此,这是我希望的结果:

"cat, dog, tiger".


那么我如何在postgresql 8.4中对一个字符串数组进行排序,然后再将其转换为字符串呢?在行“name”上的ORDER BY不起作用,内置的sort函数只处理整数值。
有没有人有好主意,如何在纯SQL中解决这个问题?
谢谢理查德

2skhul33

2skhul331#

在聚合表达式中使用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;

lvjbypge

lvjbypge2#

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

字符串

fumotvh3

fumotvh33#

虽然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的价格。

0g0grzrc

0g0grzrc4#

你有没有试过在数组上使用generate_series(),然后在结果上做一个SELECT...ORDER BY(或者只是把它嵌套在SELECT里面),然后再把它转换成一个字符串?

ioekq8ef

ioekq8ef5#

尽管如此,对于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;

字符串

kulphzqa

kulphzqa6#

为了更新这个问题,Snowflake实现了数组排序:

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

字符串
也可以使用array_sort_by对对象进行排序

相关问题