STRAGG 聚合函数
2. 功能说明
-
sys.stragg(text)是一个聚合函数,将同一分组中所有非 NULL 的文本值用逗号(,)连接。 -
NULL 值被自动忽略,不出现在结果中,也不产生多余的逗号。
-
分组内所有值均为 NULL 或分组为空集时,返回
NULL(而非空字符串)。 -
不保证输出顺序;如需确定顺序,可在聚合调用中使用
ORDER BY子句(PostgreSQL 扩展语法)。 -
函数定义于
sys模式,在 Oracle 兼容模式(不需要sys前缀)和 PG 模式下均可使用。
3. 语法
sys.stragg(expr [ORDER BY sort_expr [ASC | DESC] [, ...]])
| 参数 | 说明 |
|---|---|
|
任意可隐式转换为 |
|
可选,指定组内拼接顺序。省略时顺序不确定。 |
返回类型:text
4. 测试用例
4.1. 测试环境准备
CREATE TABLE stragg_test (dept TEXT, name TEXT);
INSERT INTO stragg_test VALUES ('HR', 'Alice');
INSERT INTO stragg_test VALUES ('HR', 'Bob');
INSERT INTO stragg_test VALUES ('HR', 'Carol');
INSERT INTO stragg_test VALUES ('IT', 'Dave');
INSERT INTO stragg_test VALUES ('IT', 'Eve');
4.2. 基础聚合
-- 单组聚合,使用 ORDER BY 保证结果确定
SELECT sys.stragg(name ORDER BY name) FROM stragg_test WHERE dept = 'HR';
-- 期望:Alice,Bob,Carol
-- 配合 GROUP BY 按部门分组
SELECT dept, sys.stragg(name ORDER BY name)
FROM stragg_test
GROUP BY dept
ORDER BY dept;
-- 期望:
-- HR | Alice,Bob,Carol
-- IT | Dave,Eve
4.3. NULL 值处理
-- 插入一行 NULL 值
INSERT INTO stragg_test VALUES ('HR', NULL);
-- NULL 被忽略,结果与无 NULL 时相同
SELECT sys.stragg(name ORDER BY name) FROM stragg_test WHERE dept = 'HR';
-- 期望:Alice,Bob,Carol
-- 所有值均为 NULL 时返回 NULL
SELECT sys.stragg(name) IS NULL FROM stragg_test WHERE name IS NULL;
-- 期望:t
4.4. 空集处理
-- 无匹配行时返回 NULL
SELECT sys.stragg(name) IS NULL FROM stragg_test WHERE dept = 'NONE';
-- 期望:t
4.5. 单值
-- 组内只有一个值时,结果中不含逗号
SELECT sys.stragg(name) FROM stragg_test WHERE dept = 'IT' AND name = 'Dave';
-- 期望:Dave