SQL Server中用split_string拆分dataaddress关联表生成地址名的问题
解决SQL Server中ID组合字段转名称拼接的问题
先给出具体表结构与示例数据,方便对照理解:
示例表结构与数据
t1表(ID-名称映射表)
| id | name |
|---|---|
| 1 | 北京市 |
| 2 | 朝阳区 |
| 3 | 某某街道 |
| 4 | 海淀区 |
t2表(存储ID组合字段)
| t2_id | dataaddress |
|---|---|
| 1 | 1,2,3 |
| 2 | 2,4 |
| 3 | 1,3 |
实现需求的SQL语句
SELECT t2.t2_id, t2.dataaddress, STRING_AGG(t1.name, ' > ') AS addressname FROM t2 CROSS APPLY STRING_SPLIT(t2.dataaddress, ',') AS split_ids LEFT JOIN t1 ON t1.id = split_ids.value GROUP BY t2.t2_id, t2.dataaddress ORDER BY t2.t2_id;
执行结果
| t2_id | dataaddress | addressname |
|---|---|---|
| 1 | 1,2,3 | 北京市 > 朝阳区 > 某某街道 |
| 2 | 2,4 | 朝阳区 > 海淀区 |
| 3 | 1,3 | 北京市 > 某某街道 |
关键逻辑说明
- CROSS APPLY STRING_SPLIT:将
t2.dataaddress按逗号拆分为多行,每行对应一个独立ID值 - LEFT JOIN t1:关联映射表获取每个ID对应的名称(若ID在t1中不存在会返回NULL,可替换为
INNER JOIN过滤无效ID) - STRING_AGG:按
t2.t2_id分组,用指定分隔符(示例用>)拼接所有关联到的名称,生成最终地址字符串
特殊场景处理
如果需要过滤掉t1中不存在的无效ID,只需把LEFT JOIN改为INNER JOIN:
SELECT t2.t2_id, t2.dataaddress, STRING_AGG(t1.name, ' > ') AS addressname FROM t2 CROSS APPLY STRING_SPLIT(t2.dataaddress, ',') AS split_ids INNER JOIN t1 ON t1.id = split_ids.value GROUP BY t2.t2_id, t2.dataaddress ORDER BY t2.t2_id;
内容的提问来源于stack exchange,提问作者Joe B
相关产品推荐
相关产品推荐

