2011-09-06 19 views
52

テーブル '動物':PostgreSQLのARRAY_AGG順

animal_name animal_type 
Tom   Cat 
Jerry  Mouse 
Kermit  Frog 

問合せ:

SELECT 
array_to_string(array_agg(animal_name),';') animal_names, 
array_to_string(array_agg(animal_type),';') animal_types 
FROM animals; 

期待される結果:

Tom;Jerry;Kerimt, Cat;Mouse;Frog 
OR 
Tom;Kerimt;Jerry, Cat;Frog;Mouse 

私は最初の集計関数で順序が常にになることを確認することができます2番目と同じです。 私が取得したいwould't意味:

Tom;Jerry;Kermit, Frog;Mouse,Cat 
+6

もしあなたが9.0であれば、入れ子になった呼び出しを 'string_agg()'と置き換えることができます –

答えて

20

あなたはPostgreSQLのバージョン、その後< 9.0上にある場合:

から:http://www.postgresql.org/docs/8.4/static/functions-aggregate.html

現在の実装では、入力の順序は原則的には指定されていません。ただし、ソートされたサブクエリからの入力値の供給は通常は機能します。例:

SELECT xmlagg(x)FROM(SELECT x FROMテストORDER BY y DESC)ASタブ;

だからあなたの場合には、あなたが書くでしょう:

SELECT 
array_to_string(array_agg(animal_name),';') animal_names, 
array_to_string(array_agg(animal_type),';') animal_types 
FROM (SELECT animal_name, animal_type FROM animals) AS x; 

ARRAY_AGGへの入力は、順序付けられていないだろうが、それは両方の列に同じになります。そしてあなたが好きなら、ORDER BY句をサブクエリに追加することができます。

+0

私はこれを考えていたが、それはバグが判明したとき私は奇妙にサブクエリでの順序が動作しないことがわかったhttps://stackoverflow.com/questions/16248813/is-order-in- a-subquery-guaranteed-to-be-preserved – Adamantish

171

は、この例のようにmanualから、ORDER BYを使用します。

SELECT array_agg(a ORDER BY b DESC) FROM table; 
+25

注: 'array_agg'の' ORDER BY'はPostgreSQL 9で導入されました – UlfR

+4

PostgreSQL 9+ – Erik

+1

ORDER BYでサンプルを選択してください。 SELECT array_agg(animal_name)、array_agg(animal_type)FROM animals; ? – GKislin

関連する問題