SQL Server:将逗号分隔字段替换为另一表的对应数据
逗号分隔爱好标识转名称的解决方案
针对people表中逗号分隔的爱好标识,要关联hobbies表替换为对应名称,可以通过拆分-关联-聚合的步骤实现,具体方案如下:
基础实现方案
适用于标识无空格、且所有标识都能在hobbies表找到匹配的场景:
SELECT p.name, p.age, STRING_AGG(h.hobby, ', ') AS hobbies FROM people p CROSS APPLY STRING_SPLIT(p.hobbies, ',') s JOIN hobbies h ON TRIM(s.value) = h.identifier GROUP BY p.name, p.age
增强版(处理空值、无效标识)
如果存在爱好为空、或者标识在hobbies表不存在的情况,可以用以下SQL兼容这类场景:
SELECT p.name, p.age, CASE WHEN p.hobbies IS NULL OR p.hobbies = '' THEN '无爱好' ELSE STRING_AGG(ISNULL(h.hobby, '未知爱好'), ', ') END AS hobbies FROM people p LEFT CROSS APPLY STRING_SPLIT(p.hobbies, ',') s LEFT JOIN hobbies h ON TRIM(s.value) = h.identifier GROUP BY p.name, p.age, p.hobbies
关键步骤说明
- 拆分字段:使用
STRING_SPLIT(p.hobbies, ',')把逗号分隔的爱好标识拆分成多行记录,通过CROSS APPLY(或LEFT CROSS APPLY兼容空值)关联到原表。 - 关联匹配:通过
TRIM(s.value)处理标识可能带有的空格,与hobbies表的identifier字段关联,获取对应的爱好名称。 - 聚合合并:使用
STRING_AGG函数把多行的爱好名称重新合并为逗号分隔的字符串,按用户的name和age分组确保每个用户仅返回一行。 - 异常处理:通过
CASE和ISNULL处理爱好为空、标识无效的情况,返回友好提示。
内容的提问来源于stack exchange,提问作者Saraf
相关产品推荐
相关产品推荐

