Sql server 将冗余电子邮件替换为sql server中唯一的电子邮件

Sql server 将冗余电子邮件替换为sql server中唯一的电子邮件,sql-server,Sql Server,我的SQL Server表中有一些冗余的电子邮件地址,而相同的名称出现在多行中 我想在电子邮件中添加一个数字,以便他们的电子邮件变得不同 我怎样才能做到这一点?您可以使用该函数来识别后续的重复项,然后在行号前面加上前缀,类似这样的内容 declare @t table (email varchar(100)) insert @t values ('pete@abc.org'), ('jane@xyz.org'), ('fred@test.com'), ('pete@abc.org') se

我的SQL Server表中有一些冗余的电子邮件地址,而相同的名称出现在多行中

我想在电子邮件中添加一个数字,以便他们的电子邮件变得不同

我怎样才能做到这一点?

您可以使用该函数来识别后续的重复项,然后在行号前面加上前缀,类似这样的内容

declare @t table (email varchar(100))

insert @t values ('pete@abc.org'), ('jane@xyz.org'), ('fred@test.com'), ('pete@abc.org')


select
    case 
        when row_number() over (partition by email order by email) > 1 
        then cast(row_number() over (partition by email order by email) as varchar(32)) + '_' + email
        else email 
    end as email
from
    @t

使用派生表中的行数进行枚举,并使用stuff将索引添加到电子邮件中

declare @T table
(
  ID int identity primary key,
  Email varchar(100)
);

insert into @T values
('abc@gmail.com'),
('abc@gmail.com'),
('abc@gmail.com'),
('cba@gmail.com');

update T
set Email = stuff(T.Email, charindex('@', T.Email), 0, cast(T.rn as varchar(11)))
from (
     select T.Email,
            row_number() over(partition by T.Email order by T.ID) as rn
     from @T as T
    ) as T
where T.rn > 1;

select *
from @T;
结果:

ID          Email
----------- ------------------
1           abc@gmail.com
2           abc2@gmail.com
3           abc3@gmail.com
4           cba@gmail.com
如果您担心新电子邮件将成为现有电子邮件的副本,您可以循环更新,直到不再有副本

while exists (
             select null
             from @T as T
             group by T.Email
             having count(*) > 1
             )
begin
  update T
  set Email = stuff(T.Email, charindex('@', T.Email), 0, cast(T.rn as varchar(11)))
  from (
       select T.Email,
              row_number() over(partition by T.Email order by T.ID)  as rn
       from @T as T
      ) as T
  where T.rn > 1;
end;

例如abc@gmail.com在表中出现两次将变为abc@gmail.com和abc1@gmail.comsame名称出现在多个列中。这有点令人困惑。请添加带有一些示例数据和预期最终结果的表结构。@MikaelEriksson很抱歉,我的意思是相同的电子邮件名称出现在多行中。如果输入数据是insert@t values,您的解决方案将无法工作pete@abc.org', 'jane@xyz.org', 'fred@test.com', 'pete@abc.org','2_pete@abc.org“@ughai你是对的,但这是OP要求的。如果OP想要完善这个问题,我会回顾这个答案。