【问题标题】:MSSQL Replace string with another string after a certain characterMSSQL 在某个字符后用另一个字符串替换字符串
【发布时间】:2019-06-15 08:16:42
【问题描述】:

我在我的 sql 过程中接收到一个电子邮件 ID。我需要用定义的字符串替换电子邮件客户端。

假设我收到诸如 abc@gmail.com 或 pqr@yahoo.com 或 mnz@hotmail.com 之类的电子邮件 ID,在这种情况下,我需要将 @gmail.com / @yahoo.com 替换为固定字符串。

abc@gmail.com - abc@outlook.com
pqr@yahoo.com - pqr@outlook.com
mnz@hotmail.com - mnz@outlook.com

所以@之后的字符串将被我定义的字符串替换,而不管过程中接收到的数据。

尝试了替换方法,但没有奏效。我知道我需要使用 charindex、substring 和 left 函数来使其工作,但没有得到正确的组合。

【问题讨论】:

    标签: sql sql-server tsql substring charindex


    【解决方案1】:

    我会在这里保持简单,只需将CHARINDEXLEFT 一起使用:

    UPDATE yourTable
    SET email_id = LEFT(email_id, CHARINDEX('@', email_id) - 1) + 'outlook.com';
    

    【讨论】:

    • 收到错误消息“左侧函数需要 2 个参数。”
    • 我会添加WHERE email_id LIKE '%@%'
    • 我想电子邮件 id 将始终包含 @ 所以不需要条件。
    【解决方案2】:

    您可以将REPLACE()CHARINDEX() 一起使用

    CREATE TABLE Strings(
      Str VARCHAR(45)
    );
    
    INSERT INTO Strings VALUES
    ('abc@gmail.com'),  
    ('pqr@yahoo.com'),  
    ('mnz@hotmail.com');
    
    UPDATE Strings
    SET Str = REPLACE(Str, SUBSTRING(Str, CHARINDEX('@',Str), LEN(Str)), '@outlook.com');
    
    SELECT *
    FROM Strings;
    

    这也是另一种方式

    UPDATE S
    SET S.Str = REPLACE(S.Str, E.V, '@outlook.com')
    FROM Strings S JOIN (VALUES('@gmail.com'), ('@hotmail.com'), ('@yahoo.com')) E(V)
    ON S.Str LIKE CONCAT('%', E.V, '%');
    

    Demo1

    Demo2

    【讨论】:

      【解决方案3】:

      如果您使用的是 SQL Server 2017,则可以将其用作主查询中的子查询:

      SELECT FIRST_VALUE(value) OVER (ORDER BY (SELECT NULL)) + '@outlook.com'
      FROM STRING_SPLIT('pqr@yahoo.com', '@');
      

      阅读更多关于FIRST_VALUEhttps://docs.microsoft.com/en-us/sql/t-sql/functions/first-value-transact-sql?view=sql-server-2017

      阅读更多关于STRING_SPLIT: https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql?view=sql-server-2017

      更新

      正如@TimBiegeleisen 提到的,微软文档说:

      输出行可以是任意顺序。订单不保证 匹配输入字符串中子字符串的顺序

      为了克服这个问题,我们甚至可以将查询重写为:

      SELECT value + '@outlook.com'
      FROM
      (
          SELECT value,
                 CHARINDEX('@', 'pqr@yahoo.com') AS atIndex,
                 CHARINDEX(value, 'pqr@yahoo.com') AS partIndex
          FROM STRING_SPLIT('pqr@yahoo.com', '@')
      ) AS K
      WHERE K.atIndex > K.partIndex;
      

      【讨论】:

      • 如果您仔细阅读STRING_SPLIT 的文档,您还会注意到表格的顺序无法保证。所以,FIRST_VALUE 可能并不总是在这里工作。
      • @TimBiegeleisen 很好的通知。我已经更新了答案
      【解决方案4】:

      您可以根据您的数据使用以下查询替换 tbl_name 和 column_name:

      UPDATE tbl_name SET column_name = replace(column_name, 'gmail.com', 'outlook.com');    
      UPDATE tbl_name SET column_name = replace(column_name, 'yahoo.com', 'outlook.com');    
      UPDATE tbl_name SET column_name = replace(column_name, 'hotmail.com', 'outlook.com');
      

      【讨论】:

      • 那么其他所有域呢?这不会很好地扩展。
      • “BikerDude.HogMail.Comics@42.com”变成了什么?好吧,“gmail.com”就在那里,所以...... .
      猜你喜欢
      • 2019-05-14
      • 2013-12-03
      • 2011-02-21
      • 1970-01-01
      • 2017-01-28
      • 2017-03-07
      • 2021-06-15
      • 2011-04-06
      相关资源
      最近更新 更多