在日常工作中会遇到将多行的值拼接为一个值展现,如果使用过Oracle数据库,可以使用list_agg的聚合函数来实现。那么PostgreSQL也有这样的功能,函数为string_agg。具体用法如下:

建表

CREATE TABLE student(
	id  serial PRIMARY KEY,
	name varchar(240),
	address varchar(500),
	grade varchar(20)
)

录入测试数据

INSERT INTO student(name,address,grade) values('小A','天河一路','一年级1班');
INSERT INTO student(name,address,grade) values('小B','天河一路','一年级1班');
INSERT INTO student(name,address,grade) values('小C','天河一路','一年级2班');
INSERT INTO student(name,address,grade) values('小D','天河一路','一年级2班');

将同班级的学生拼接显示

SELECT string_agg(name,',') FROM student GROUP BY grade;
--结果:
string_agg|
----------|
小A,小B     |
小C,小D     |

如果需要对拼接的值去重,可以这样处理:

SELECT string_agg(address,',') FROM student GROUP BY grade;
--未去重的情况下:
string_agg|
----------|
天河一路,天河一路 |
天河一路,天河一路 |
SELECT string_agg(distinct address,',') FROM student GROUP BY grade;
string_agg|
----------|
天河一路      |
天河一路      |

如果想对拼接的值做排序,可以在拼接符号后面加order by

SELECT string_agg(name,',' order by name desc) FROM student GROUP BY grade;
--结果:
string_agg|
----------|
小B,小A     |
小D,小C     |

注意:如果使用了排序且使用了distinct关键字去重,order by 的排序字段必须包含去重的字段

比如对grade字段去重,那么order by 后面必须要有grade字段,不然会报:SQL 错误 [42P10]: 错误: 在带有DISTINCT子句的聚合函数中,ORDER BY子句后面的表达式必须在参数列表中出现

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐