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

SQL Server 2012中去除varchar(max)列内重复邮箱的方法

解决SQL Server 2012中去除分号分隔邮箱重复项的方法

针对你描述的场景,这里提供一种基于XML拆分+去重+合并的实现方案,完全适配SQL Server 2012的特性:

核心思路

  1. 处理NULL值:若原列为NULL,直接返回NULL
  2. 拆分字符串:将分号分隔的邮箱列表拆分为独立行,同时清理每个邮箱前后的空格
  3. 去重:通过DISTINCT过滤重复的邮箱地址
  4. 合并字符串:将去重后的邮箱重新拼接为分号分隔的格式,确保首尾无多余分隔符

具体实现代码

假设你的表名为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:48:22