SQL Server 2012中去除varchar(max)列内重复邮箱的方法
解决SQL Server 2012中去除分号分隔邮箱重复项的方法
针对你描述的场景,这里提供一种基于XML拆分+去重+合并的实现方案,完全适配SQL Server 2012的特性:
核心思路
- 处理NULL值:若原列为NULL,直接返回NULL
- 拆分字符串:将分号分隔的邮箱列表拆分为独立行,同时清理每个邮箱前后的空格
- 去重:通过
DISTINCT过滤重复的邮箱地址 - 合并字符串:将去重后的邮箱重新拼接为分号分隔的格式,确保首尾无多余分隔符
具体实现代码
假设你的表名为EmailTable,存储邮箱的列名为EmailList,可以用以下查询实现:
SELECT t.Id, CASE WHEN t.EmailList IS NULL THEN NULL ELSE STUFF( ( SELECT DISTINCT '; ' + LTRIM(RTRIM(s.value('.', 'varchar(max)'))) FROM ( SELECT CAST('<x>' + REPLACE(t.EmailList, ';', '</x><x>') + '</x>' AS XML) AS XmlData ) AS x CROSS APPLY XmlData.nodes('x') AS Split(s) WHERE LTRIM(RTRIM(s.value('.', 'varchar(max)'))) <> '' FOR XML PATH(''), TYPE ).value('.', 'varchar(max)'), 1, 2, '' ) AS UniqueEmailList FROM EmailTable t;
代码说明
- 拆分逻辑:通过
REPLACE将分号替换为XML标签,再用nodes()方法拆分出每个邮箱节点,LTRIM(RTRIM)用于清理邮箱前后的空格 - 去重:
DISTINCT关键字确保每个邮箱地址只保留一次 - 合并逻辑:
FOR XML PATH('')将去重后的邮箱拼接成带前置;的字符串,STUFF函数去掉开头多余的; - 空值与空串处理:
CASE语句保留原列的NULL值,WHERE条件过滤拆分后可能出现的空字符串
测试示例
对于输入:noone@anywhere.com; bob@company.com; noone@anywhere.com
执行后将输出:bob@company.com; noone@anywhere.com
内容的提问来源于stack exchange,提问作者Maxcot
相关产品推荐
相关产品推荐

