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
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 .
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
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;
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;
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?
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;