【问题标题】:Replacing multiple strings with the same string replacement用相同的字符串替换替换多个字符串
【发布时间】:2020-08-31 16:04:04
【问题描述】:

一直在寻找这个,我不认为嵌套替换是答案。我有一个需要保持唯一的电子邮件地址列表,但我需要将它们全部伪造以进行测试。所以我的想法是将“.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;

【问题讨论】:

    标签: sql-server replace sql-update


    【解决方案1】:

    遵循KISS 原则,只需运行 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%';
    

    【讨论】:

    • 我希望有一些我不知道的简单功能,但既然没有我同意这一点。使用 excel 可以很容易地创建一个更新脚本以达到 100 多个结尾。谢谢!
    【解决方案2】:

    我认为这样的事情应该可行。

    UPDATE Customer
      SET Email (case 
          where CHARINDEX(Email, '.com') > 0 then REPLACE(Email, '.com','.mydomain.com')
          where CHARINDEX(Email, '.net') > 0 then REPLACE(Email, '.net','.mydomain.com')
          where CHARINDEX(Email, '.org') > 0 then REPLACE(Email, '.org','.mydomain.com')
          end)
    where email not like '%.mydomain.com%'
    

    可以将CHARINDEX 替换为任何验证字符串是否包含子字符串的函数。

    【讨论】:

      【解决方案3】:

      您可以使用UPDATE ... FROM 加入要替换的 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';
      

      db<>fiddle

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

      【讨论】:

        【解决方案4】:

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

        update Customer set email = replace(replace(email, '.com', '.mydomain.com'), '.net', '.mydomain.com')
        

        您可以根据需要进入任意多个级别。您甚至可以动态生成替换语句。

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

        【讨论】:

        • 来自 OP 的引述:“......我不认为嵌套替换是答案。”
        猜你喜欢
        • 1970-01-01
        • 2022-12-15
        • 2015-03-15
        • 2017-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-01
        相关资源
        最近更新 更多