SQLを使っていると、次のように複数行の値をカンマ区切りで1つにまとめたい場面があります。
🔹例:従業員テーブル
| employee_id | skill |
|---|---|
| 1 | Java |
| 1 | SQL |
| 1 | Python |
| 2 | HTML |
| 2 | CSS |
これを次のように集約したい👇
| employee_id | skills |
|---|---|
| 1 | Java, SQL, Python |
| 2 | HTML, CSS |
こういった「行→1セルまとめ」が必要な時に便利なのが、
👉 LISTAGG
👉 STRING_AGG
の2つです。
データベースごとに対応状況が違うので、環境別にサンプル付きで解説します。
🔧 Oracle:LISTAGG
Oracleでは以下の構文を使用します。
📌ポイント
| 項目 | 説明 |
|---|---|
| LISTAGG(値, 区切り文字) | 行を連結する |
| WITHIN GROUP (ORDER BY ...) | 並び順を指定 |
| GROUP BY | 行をまとめたい単位 |
❗注意:ORA-01489 対策
LISTAGGは文字列長上限でエラーになる場合があります。
Oracle 12c 以降なら ON OVERFLOW オプションで回避可👇
🧩 PostgreSQL / MySQL / SQL Server:STRING_AGG
最近のDBでは STRING_AGG が標準SQL 関数として使えます。
PostgreSQL
MySQL(8.0以降)
※ MySQL 8.0.21 までは
GROUP_CONCAT()が一般的でした。
📌旧式例:
SQL Server
🔍LISTAGG / STRING_AGG 対応表
| DB | 推奨関数 | ORDER BY記法 | 文字列制限 |
|---|---|---|---|
| Oracle | LISTAGG | WITHIN GROUP | 上限あり(対策あり) |
| PostgreSQL | STRING_AGG | ... ORDER BY ... | 制限なし |
| MySQL | STRING_AGG / GROUP_CONCAT | ORDER BY OK | 最大長設定可 |
| SQL Server | STRING_AGG | WITHIN GROUP | 制限なし |
まとめ
複数行の値を1行にまとめたい時は、DBごとに次の関数を使います👇
| ケース | 使う関数 |
|---|---|
| Oracle | LISTAGG |
| PostgreSQL | STRING_AGG |
| MySQL | STRING_AGG または GROUP_CONCAT |
| SQL Server | STRING_AGG |
✔よくある用途
-
システムロールや権限一覧を1行表示
-
商品カテゴリをまとめて表示
-
ログタグや属性を1セルで表現
必要な時にすぐ引けるよう、ブックマーク推奨の機能です👍
📢終わりに
SQLはDBによって方言が多いですが、このまとめを覚えておくと業務で「値を1セルにまとめたい時」に迷わなくなります。
