Sort a text aggregate created with array_agg in postgresql

前端 未结 6 2089
傲寒
傲寒 2021-02-05 04:42

I have a table in postgresql. The following table \"animals\" will do to explain my problem:

name
------
tiger
cat
dog

Now I am using the follo

相关标签:
6条回答
  • 2021-02-05 04:57

    Although Matthew Wood's answer is better for your case, here is a way to sort arrays in PostgreSQL 8.4 and up:

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

    Knowing the array and unnest functions can be handy, since it also lets you do things like "map" over an array:

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

    Again, this can be yours for the price of PostgreSQL 8.4 .

    0 讨论(0)
  • 2021-02-05 05:00

    To update on this question, Snowflake has implemented array sorting:

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

    Can also use array_sort_by to sort an object

    0 讨论(0)
  • 2021-02-05 05:08

    This will be available in PostgreSQL 9.0:

    http://www.postgresql.org/docs/9.0/static/release-9-0.html, Section E.1.3.6.1. Aggregates

    In the meantime, you could do something like this which may solve the problem (albeit clunky):

    SELECT array_agg(animal_name)
    FROM (
        SELECT "name" AS animal_name
        FROM animals
        ORDER BY "name"
    ) AS sorted_animals;
    
    0 讨论(0)
  • 2021-02-05 05:08

    Still, for version 8.4, using the solution suggested by Matthew Wood, if you need to do a grouping in the outer query, the inner query should be sorted, too, for the sorting to be consistent.

    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;
    
    0 讨论(0)
  • 2021-02-05 05:17

    Have you tried to use generate_series() on the array, and then do a SELECT...ORDER BY on that result (or just nest it inside of the SELECT) before you convert it to a string?

    0 讨论(0)
  • 2021-02-05 05:21

    For modern PostgreSQL (since version 9.0), you can use an ORDER BY clause in an aggregate expression:

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

    Also, for your specific purpose, you can use string_agg to simplify your query:

    SELECT
        string_agg(name, ', ' ORDER BY name)
    FROM
        animals;
    
    0 讨论(0)
提交回复
热议问题