Sql server 用相同的字符串替换替换多个字符串

Sql server 用相同的字符串替换替换多个字符串,sql-server,replace,sql-update,Sql Server,Replace,Sql Update,我一直在寻找这个,但我不认为嵌套替换是答案。我有一个电子邮件地址的列表,我需要保持唯一性,但我需要使他们都假测试。因此,我的想法是将“.com”、“.net”、“.org”等替换为“.mydomain.com”。但总的来说有很多结局 我意识到我可以删除@并在末尾添加“@mydomain.com”,但现在我也想知道如何解决这个特殊问题 而不是做: BEGIN TRANSACTION; UPDATE Customer SET Email=REPLACE(Email, '.com','.mydo

我一直在寻找这个,但我不认为嵌套替换是答案。我有一个电子邮件地址的列表,我需要保持唯一性,但我需要使他们都假测试。因此,我的想法是将“.com”、“.net”、“.org”等替换为“.mydomain.com”。但总的来说有很多结局

我意识到我可以删除@并在末尾添加“@mydomain.com”,但现在我也想知道如何解决这个特殊问题

而不是做:

BEGIN TRANSACTION; 
UPDATE Customer
  SET Email=REPLACE(Email, '.com','.mydomain.com')
where email not like '%.mydomain.com%'
COMMIT TRANSACTION;
对于每种情况,“.com”、“.net”、“.org”

有没有办法说,在一条语句中用“.mydomain.com”替换所有这些“.com”、“.net”、“.org”

像这样的

BEGIN TRANSACTION; 
UPDATE Customer
  SET Email=REPLACE(Email, (in ('.com', '.net', '.org')),'.mydomain.com')
where email not like '%.mydomain.com%'
COMMIT TRANSACTION;
按照这个原则,只需运行3个单独的查询

update Customer set email = replace(email, '.com', '.mydomain.com') where email not like '%.mydomain.com%';
update Customer set email = replace(email, '.net', '.mydomain.com') where email not like '%.mydomain.com%';
update Customer set email = replace(email, '.org', '.mydomain.com') where email not like '%.mydomain.com%';

我想这样的办法应该行得通

更新客户 设置电子邮件大小写 其中CHARINDEXEmail,'.com'>0然后替换email,'.com','.mydomain.com' 其中CHARINDEXEmail,'.net'>0然后替换电子邮件,'.net','.mydomain.com' 其中CHARINDEXEmail,'.org'>0然后替换email,'.org','.mydomain.com' 终止 其中电子邮件与“%.mydomain.com%”不同
可以用验证字符串是否包含子字符串的任何函数替换CHARINDEX。

另一种解决方案是使用嵌套的替换语句:

update Customer set email = replace(replace(email, '.com', '.mydomain.com'), '.net', '.mydomain.com')
你可以继续到你想要的任何级别。您甚至可以动态生成replace语句

另一种可能的解决方案是使用存储过程。

您可以使用更新。。。从以联接要替换的TLD的派生表。如果有TLD,也可以将实际表与TLD连接

UPDATE c
       SET c.email = replace(c.email, concat('.', tld.tld), '.mydomain.com')
       FROM customer c
            INNER JOIN (VALUES ('com'),
                               ('org'),
                               ('net')) tld (tld)
                       ON c.email LIKE concat('%.', tld.tld)
       WHERE c.email NOT LIKE '%.mydomain.com';

但是,如果与TLD匹配的子字符串在字符串末尾的其他位置,则该子字符串也会被替换,这并不能解决问题。但这可能不是一个问题。

引用OP:。。。我不认为嵌套替换是答案。我希望有一些简单的函数我不知道,但既然没有,我同意这一点。使用excel很容易创建一个更新脚本,以达到100多个结尾。谢谢NP看见