WM_CONCAT 是 Oracle 数据库中一个非官方的聚合函数(属于 Oracle 内部函数,未正式文档正式支持),用于将多行数据的某一列值拼接成一个字符串,通常用逗号分隔。
基本语法
WM_CONCAT(列名)
- 作用:将分组内指定列的多行值拼接为一个字符串(默认用逗号分隔)。
- 适用场景:需要将多行数据合并为单行展示时(如“一行显示某个部门的所有员工姓名”)。
示例
假设有表 EMP 如下:
| DEPTNO | ENAME |
|---|---|
| 10 | CLARK |
| 10 | KING |
| 10 | MILLER |
| 20 | SMITH |
| 20 | JONES |
使用 WM_CONCAT 按部门拼接员工姓名:
SELECT DEPTNO,WM_CONCAT(ENAME) AS DEPT_EMPLOYEES
FROM EMP
GROUP BY DEPTNO;
结果:
| DEPTNO | DEPT_EMPLOYEES |
|---|---|
| 10 | CLARK,KING,MILLER |
| 20 | SMITH,JONES |
注意事项
-
非官方函数,兼容性差
WM_CONCAT并非 Oracle 官方推荐的函数,在 Oracle 12c 及以上版本中已被移除(或隐藏),可能导致“标识符无效”错误。不建议在生产环境使用。 -
替代方案:
LISTAGG(官方推荐)
Oracle 11g 及以上版本提供了官方支持的LISTAGG函数,功能更强大且稳定,语法如下:-- 基本用法(默认逗号分隔) SELECT DEPTNO,LISTAGG(ENAME, ',') WITHIN GROUP (ORDER BY ENAME) AS DEPT_EMPLOYEES FROM EMP GROUP BY DEPTNO;LISTAGG(列名, 分隔符):指定拼接的列和分隔符。WITHIN GROUP (ORDER BY ...):可选,指定拼接时的排序规则。
-
结果类型限制
WM_CONCAT返回值类型为VARCHAR2或CLOB(取决于拼接后长度),若拼接结果过长可能报错。LISTAGG也有长度限制(默认VARCHAR2(4000)),超过时可结合ON OVERFLOW TRUNCATE处理(12c+ 支持)。 -
大小写问题
部分环境中WM_CONCAT可能需要大写(WM_CONCAT),否则报错,因 Oracle 对未加引号的标识符默认转为大写。
总结
WM_CONCAT 可临时用于低版本 Oracle(11g 及以下)的字符串拼接,但因其非官方性和兼容性问题,推荐优先使用官方函数 LISTAGG,避免升级数据库后出现兼容性问题。