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

如何编写SQL查询将Table B的ID列表转换为对应名称列表

SQL查询:将逗号分隔ID转换为对应姓名列表

现有两张数据表:

  • Table A:字段为ID(人员唯一标识)、Name(人员姓名)
  • Table B:字段为Location(地点)、Listofpeople(逗号分隔的人员ID字符串,格式示例:"1,2,3")

需要编写SQL查询,输出每个地点对应的逗号分隔姓名列表,结果格式如下:

Location | Listofpeoplenames
---------|------------------------
总部     | 张三,李四,王五
分部     | 赵六

不同数据库的实现方案

MySQL/MariaDB

利用FIND_IN_SET匹配ID,GROUP_CONCAT聚合姓名:

SELECT 
    b.Location,
    GROUP_CONCAT(a.Name SEPARATOR ',') AS Listofpeoplenames
FROM 
    TableB b
JOIN 
    TableA a ON FIND_IN_SET(a.ID, REPLACE(b.Listofpeople, ' ', '')) > 0
GROUP BY 
    b.Location;

注:REPLACE用来处理ID间可能存在的空格,比如"1, 2"这种格式

SQL Server(2017+)

用STRING_SPLIT拆分ID字符串,STRING_AGG聚合姓名:

SELECT 
    b.Location,
    STRING_AGG(a.Name, ',') AS Listofpeoplenames
FROM 
    TableB b
CROSS APPLY 
    STRING_SPLIT(b.Listofpeople, ',') AS split_ids
JOIN 
    TableA a ON TRIM(split_ids.value) = a.ID
GROUP BY 
    b.Location;

如果是2016及更早版本,需要自定义字符串拆分函数,再结合FOR XML PATH实现聚合

PostgreSQL

通过STRING_TO_ARRAY拆分ID,ANY匹配关联,STRING_AGG聚合:

SELECT 
    b.Location,
    STRING_AGG(a.Name, ',' ORDER BY a.Name) AS Listofpeoplenames
FROM 
    TableB b
JOIN 
    TableA a ON a.ID = ANY(STRING_TO_ARRAY(b.Listofpeople, ','))
GROUP BY 
    b.Location;

或者用UNNEST展开数组后关联:

SELECT 
    b.Location,
    STRING_AGG(a.Name, ',') AS Listofpeoplenames
FROM 
    TableB b,
    UNNEST(STRING_TO_ARRAY(b.Listofpeople, ',')) AS split_id
JOIN 
    TableA a ON TRIM(split_id) = a.ID
GROUP BY 
    b.Location;

注意事项

  • 确保TableA的ID与Listofpeople中拆分出的ID格式完全匹配(数字类型一致、字符串无大小写/空格差异)
  • 如果Listofpeople包含无效ID(在TableA中不存在),可将JOIN改为LEFT JOIN,此时无效ID对应的姓名会被忽略,按需调整逻辑

内容的提问来源于stack exchange,提问作者Joe Da

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 01:16:00