我在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很多 理查德
答案 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
);
了解array
和unnest
函数非常方便,因为它还允许您对数组执行"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
对对象进行排序