listagg
时间: 2025-05-08 19:39:14 浏览: 27
### LISTAGG 函数概述
`LISTAGG` 是 Oracle 数据库中的一个聚合函数,用于将多行数据连接成单个字符串。此函数允许指定分隔符以及排序顺序[^1]。
### 语法结构
基本语法如下:
```sql
LISTAGG(column_name, delimiter) WITHIN GROUP (ORDER BY sort_column)
```
- `column_name`: 要连接的列名。
- `delimiter`: 各项之间的分隔符。
- `WITHIN GROUP (ORDER BY ...)`: 定义返回值内部项目的排列次序。
### 实际应用案例
#### 示例一:简单列表聚合
假设有一个名为 `employees` 的表,其中包含员工姓名和部门信息。为了获取每个部门内所有成员的名字列表,可执行以下查询语句:
```sql
SELECT department,
LISTAGG(name, ', ') WITHIN GROUP (ORDER BY name) AS employee_list
FROM employees
GROUP BY department;
```
这段代码将会按照部门分类汇总员工名字,并以逗号加空格的形式作为分隔符显示出来。
#### 示例二:处理重复条目
如果希望去除重复记录再进行聚合操作,则可以在较新版本(如 Oracle 19c 及以上)中直接利用 `DISTINCT` 关键字简化逻辑:
```sql
SELECT department,
LISTAGG(DISTINCT name, '; ') WITHIN GROUP (ORDER BY name) AS unique_employee_list
FROM employees
GROUP BY department;
```
对于早期版本数据库而言,可以通过正则表达式的技巧达到相同效果[^4]。
#### 示例三:管理 NULL 值
默认情况下,`LISTAGG` 不会考虑为空的数据项;然而,有时可能需要保留这些位置并赋予特殊标记。此时可以借助辅助性的 `NULLIF()` 或者其他条件判断机制完成定制化需求:
```sql
SELECT department,
LISTAGG(NULLIF(name, 'NULL'), '|') WITHIN GROUP (ORDER BY hire_date DESC) AS nullable_employeelist
FROM employees
WHERE job_title IS NOT NULL -- 这里可以根据实际情况调整过滤条件
GROUP BY department;
```
上述例子展示了如何通过设置不同的参数组合来灵活运用 `LISTAGG` 功能满足多样化的业务场景要求[^3]。
阅读全文
相关推荐


















