You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 13:48:18