字串聚合函數 (SQL String Aggregation)
字串聚合函數用來將多筆資料的字串值合併成一個字串,常搭配 GROUP BY 使用。不同資料庫有不同的函數名稱。
各資料庫語法
| 資料庫 | 函數 |
|---|---|
| MySQL | GROUP_CONCAT() |
| SQL Server 2017+ | STRING_AGG() |
| PostgreSQL | STRING_AGG() |
| Oracle | LISTAGG() |
範例資料
假設有一個訂單資料表 orders:
| customer_id | product |
|---|---|
| 1 | 蘋果 |
| 1 | 香蕉 |
| 1 | 橘子 |
| 2 | 葡萄 |
| 2 | 西瓜 |
MySQL - GROUP_CONCAT()
SELECT customer_id, GROUP_CONCAT(product) AS products
FROM orders
GROUP BY customer_id;
結果:
| customer_id | products |
|---|---|
| 1 | 蘋果,香蕉,橘子 |
| 2 | 葡萄,西瓜 |
自訂分隔符號
SELECT customer_id, GROUP_CONCAT(product SEPARATOR ' / ') AS products
FROM orders
GROUP BY customer_id;
結果:蘋果 / 香蕉 / 橘子
排序後合併
SELECT customer_id, GROUP_CONCAT(product ORDER BY product ASC) AS products
FROM orders
GROUP BY customer_id;
去除重複值
SELECT customer_id, GROUP_CONCAT(DISTINCT product) AS products
FROM orders
GROUP BY customer_id;
SQL Server - STRING_AGG()
SQL Server 2017 以後版本支援:
SELECT customer_id, STRING_AGG(product, ',') AS products
FROM orders
GROUP BY customer_id;
排序後合併
SELECT customer_id,
STRING_AGG(product, ',') WITHIN GROUP (ORDER BY product) AS products
FROM orders
GROUP BY customer_id;
PostgreSQL - STRING_AGG()
SELECT customer_id, STRING_AGG(product, ',') AS products
FROM orders
GROUP BY customer_id;
排序後合併
SELECT customer_id, STRING_AGG(product, ',' ORDER BY product) AS products
FROM orders
GROUP BY customer_id;
Oracle - LISTAGG()
SELECT customer_id, LISTAGG(product, ',') WITHIN GROUP (ORDER BY product) AS products
FROM orders
GROUP BY customer_id;
常見用途
- 報表呈現:將多筆關聯資料顯示在同一行
- 標籤列表:將商品的多個標籤合併顯示
- 收件者清單:將多個 email 合併成一個字串