首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle WM_CONCAT 函數:簡單高效的分組字串聚合

     編輯:Oracle 資料庫基礎

函數簡介

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斤)

注意事項

  • 非官方支援:Oracle 不保證版本相容性,12c 後已標記為過時,未來版本可能移除。
  • 長度限制:回傳型別為 VARCHAR2,最大 4000 位元組(12c+ 可擴展至 32K),超長會截斷或報錯。
  • 排序不可控:聚合順序不保證,需排序請用 LISTAGG 或 XMLAGG。
  • NULL 值:自動忽略 NULL。

現代替代方案(建議生產環境使用)

函數版本特點
LISTAGG(expr, delim) WITHIN GROUP (ORDER BY ...)11g R2+標準 SQL、支援排序、可控長度(溢位可 ON OVERFLOW TRUNCATE)
XMLAGG(XMLELEMENT(e, expr).EXTRACT('//text()'))9i+無長度限制、可排序、語法較繁瑣
JSON_ARRAYAGG12c+產出 JSON 陣列,易於前端消費

LISTAGG 範例

SELECT u_id,
       LISTAGG(goods, ',') WITHIN GROUP (ORDER BY goods) AS goods_sum
FROM shopping
GROUP BY u_id;

結語

WM_CONCAT 適合快速原型、臨時查詢或內部工具;正式專案請改用 LISTAGG 確保長期可維護性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved