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で順序を指定する