MSSQL将某个字符后的字符串替换为另一个字符串

时间:2019-06-15 08:16:42

标签: sql sql-server tsql substring charindex

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

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

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

因此@后面的字符串将被我定义的字符串替换,而与过程中接收到的数据无关。

尝试了替换方法,但是没有用。我知道我需要使用charindex,substring和left函数来使其正常工作,但不能获得正确的组合。

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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

答案 2 :(得分:0)

如果您使用的是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_SPLIThttps://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql?view=sql-server-2017

更新

正如@TimBiegeleisen所提到的,Microsoft文档说:

  

输出行可以按任何顺序排列。订单不保证   匹配输入字符串中子字符串的顺序

要克服这一点,我们甚至可以将查询重写为:

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;

答案 3 :(得分:-1)

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