アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

('ω') < イザユケエンジニャー

PostgreSQLでgroup_concat的なことをする

まさかPostgreSQL触り始めた途端にgroup_concatが必要になる局面が訪れるとは思わんかった。
MySQLやってた5年間でもロクに使わんかったというのに。

以下のようなテーブル names があるとして

type name
1 Andley
1 Bill
2 Cathy
1 Darlton
2 Emily

以下のように、typeごとにnameをカンマ区切りにした結果が欲しいときのクエリ。

type name_list
1 Andley,Bill,Darlton
2 Cathy,Emily

指定カラムを配列にするARRAY_AGGと、配列を文字列にするARRAY_TO_STRINGの合わせ技。
動作するのは8.4以降?

SELECT
  "type"
 ,ARRAY_TO_STRING(ARRAY_AGG("name"), ',') AS "name_list"
FROM
  "names"
GROUP BY
  "type"

ARRAY_AGG内にORDER句を入れてもOK。

SELECT
  "type"
 ,ARRAY_TO_STRING(ARRAY_AGG("name" ORDER BY "name" DESC), ',') AS "name_list"
FROM
  "names"
GROUP BY
  "type"

9.0以降ならこれでもOKらしい?(未確認)

SELECT
  "type"
 ,STRING_AGG("name", ',') AS "name_list"
FROM
  "names"
GROUP BY
  "type"

ちなみにMySQLならこう。

SELECT
  `type`
 ,GROUP_CONCAT(`name` separator ',') AS `name_list`
FROM
  `names`
GROUP BY
  `type`


参考
PostgreSQLでMySQLのgroup_concat関数のようなことをする: ぷ~ろぐ
[PostgreSQL 9.0+] string_aggで順序を指定する