MSSQL Заменить строку другой строкой после определенного символа - PullRequest
0 голосов
/ 15 июня 2019

Я получаю идентификатор электронной почты в своей процедуре sql. Мне нужно заменить почтовый клиент определенной строкой.

Предположим, я получил идентификатор электронной почты, например abc@gmail.com или pqr@yahoo.comили mnz@hotmail.com, в таких случаях мне нужно заменить @ gmail.com / @ yahoo.com фиксированной строкой.

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

Таким образом, строка после @ будет заменена моей определенной строкой независимо от того,данных, полученных в процедуре.

Метод Tried Replace, но он не работает.Я знаю, что мне нужно использовать функции charindex, substring и left, чтобы это работало, но не получаю правильную комбинацию.

Ответы [ 4 ]

2 голосов
/ 15 июня 2019

Вы можете использовать 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

Демо2

2 голосов
/ 15 июня 2019

Я хотел бы сделать это просто и просто использовать CHARINDEX с LEFT:

UPDATE yourTable
SET email_id = LEFT(email_id, CHARINDEX('@', email_id) - 1) + 'outlook.com';
0 голосов
/ 15 июня 2019

Если вы используете 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 говорится:

Выводстроки могут быть в любом порядке.Не гарантируется, что порядок соответствует порядку подстрок во входной строке

. Чтобы преодолеть это, мы можем даже переписать запрос следующим образом:

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;
0 голосов
/ 15 июня 2019

Вы можете использовать следующие запросы для замены 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');
...