2010-08-11 72 views
17

我在postgresql中有一個表。下表「動物」會做解釋我的問題:對在postgresql中使用array_agg創建的文本聚合進行排序

name 
------ 
tiger 
cat 
dog 

現在,我使用下面的查詢:

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

結果是:「老虎,貓,狗」。但是我想在彙總到一個字符串之前對它進行排序。所以這是我希望的結果:

"cat, dog, tiger". 

那麼,如何可以將其轉換爲字符串之前排序中的PostgreSQL 8.4的字符串數組。行「name」上的ORDER BY不起作用,內置的排序函數只處理整數值。

任何人都是一個好主意,如何在純SQL中解決這個問題?

感謝名單了很多 理查德

回答

11

這將在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; 
+0

這會做!很高興知道它將在9.0中實施。 – Richard 2010-08-11 20:16:29

0

您是否嘗試過在陣列上使用generate_series(),然後執行該結果一SELECT...ORDER BY(或只是巢它SELECT內部)將其轉換爲字符串之前?

+0

我剛嵌套它。子選擇做了我需要的魔法。 – Richard 2010-08-11 20:42:20

3

雖然馬修·伍德的回答是對你的情況比較好,這裏是一個辦法陣列中排序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的價格。

+0

我會牢記一個很好的解決方法。非常感謝你。 – Richard 2010-08-11 20:41:19

39

PostgreSQL 9.0 and later,您可以在聚合表達式中使用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; 
+0

感謝您的提示! – Richard 2011-09-23 06:29:36

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; 
相關問題