WM_CONCAT 是 Oracle 內建但未正式文件化的函數(屬於 WMSYS schema),可直接將群組內的字串值以逗號合併,語法極簡潔。
-- 建立測試表
CREATE TABLE shopping (u_id NUMBER, goods VARCHAR2(20), num NUMBER);
INSERT INTO shopping VALUES (1, '蘋果', 2);
INSERT INTO shopping VALUES (2, '梨子', 5);
INSERT INTO shopping VALUES (1, '西瓜', 4);
INSERT INTO shopping VALUES (3, '葡萄', 1);
INSERT INTO shopping VALUES (3, '香蕉', 1);
INSERT INTO shopping VALUES (1, '橘子', 3);
-- 聚合商品名稱
SELECT u_id, WM_CONCAT(goods) AS goods_sum
FROM shopping
GROUP BY u_id;
-- 結果
-- U_ID GOODS_SUM
-- 1 蘋果,西瓜,橘子
-- 2 梨子
-- 3 葡萄,香蕉
SELECT u_id,
WM_CONCAT(goods || '(' || num || '斤)') AS goods_sum
FROM shopping
GROUP BY u_id;
-- 結果
-- 1 蘋果(2斤),西瓜(4斤),橘子(3斤)
-- 2 梨子(5斤)
-- 3 葡萄(1斤),香蕉(1斤)
VARCHAR2,最大 4000 位元組(12c+ 可擴展至 32K),超長會截斷或報錯。LISTAGG 或 XMLAGG。| 函數 | 版本 | 特點 |
|---|---|---|
LISTAGG(expr, delim) WITHIN GROUP (ORDER BY ...) | 11g R2+ | 標準 SQL、支援排序、可控長度(溢位可 ON OVERFLOW TRUNCATE) |
XMLAGG(XMLELEMENT(e, expr).EXTRACT('//text()')) | 9i+ | 無長度限制、可排序、語法較繁瑣 |
JSON_ARRAYAGG | 12c+ | 產出 JSON 陣列,易於前端消費 |
SELECT u_id,
LISTAGG(goods, ',') WITHIN GROUP (ORDER BY goods) AS goods_sum
FROM shopping
GROUP BY u_id;
WM_CONCAT 適合快速原型、臨時查詢或內部工具;正式專案請改用 LISTAGG 確保長期可維護性。