PostgreSQL解决LEFT JOIN一对多重复行 合并手机号为逗号分隔记录
PostgreSQL 实现一对多关联字段逗号拼接方案
直接使用LEFT JOIN会返回重复人员记录的原因是,每匹配到一个电话号码就会生成一行关联结果,使用PostgreSQL内置的string_agg聚合函数配合分组,即可将同人员的多个电话号码合并为单行逗号拼接的结果,完全匹配预期输出格式。
首先假设两张表的关联逻辑为:telephone表通过外键字段people_id关联people表的主键id,电话号码存储在telephone表的phone字段中,可根据实际表结构替换对应字段名。
基础实现SQL如下:
SELECT p.id, p.names, string_agg(t.phone, ',') AS phones FROM people p LEFT JOIN telephone t ON p.id = t.people_id GROUP BY p.id;
常用适配调整
- 号码去重:如果同一个人员下存在重复存储的电话号码,可在聚合函数内加
DISTINCT关键字去重:string_agg(DISTINCT t.phone, ',') AS phones - 指定拼接顺序:如果需要按规则排序电话号码后再拼接,可在聚合函数内加
ORDER BY子句,比如按号码录入时间升序拼接:string_agg(t.phone, ',' ORDER BY t.create_time) AS phones - 空值处理:没有登记电话号码的人员,
phones字段默认返回NULL,如果需要替换为空字符串,可套一层COALESCE函数:COALESCE(string_agg(t.phone, ','), '') AS phones
语法说明:PostgreSQL默认开启主键函数依赖检测,当
GROUP BY字段为people表的主键id时,直接查询同表的names等其他字段属于合法语法,不需要把所有展示字段都加入GROUP BY子句。
内容的提问来源于stack exchange,提问作者misterxis1980
相关产品推荐
相关产品推荐

