MSSQL 在某个字符后用另一个字符串替换字符串

MSSQL Replace string with another string after a certain character

我在 sql procedure.I 中收到一个电子邮件 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 函数来使其工作但没有得到正确的组合。

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

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

您可以使用 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

您可以根据您的数据使用以下查询替换 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');

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

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

阅读更多关于 FIRST_VALUE 的信息:https://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 提到的,Microsoft 文档说:

The output rows might be in any order. The order is not guaranteed to match the order of the substrings in the input string

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

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;