Вот возможное решение, основанное на предположении, что у вас есть какой-то столбец ID
, который может помочь идентифицировать каждую уникальную строку:
;with smpl as (
select *
from (values
(1, 'cesarcastillo88@hotmail.com ; laura23@gmail.com ; test@compliance.com'),
(2, 'abc@cde.net'),
(3, 'laura23@gmail.com ; test@compliance.com')) x(id, email)
), split(id, A, B) as (
select distinct id, CAST(LEFT(email, CHARINDEX(';',email+';')-1) as varchar(100)),
CAST(STUFF(email, 1, CHARINDEX(';',email+';'), '') as varchar(100))
from smpl
union all
select id, CAST(LEFT(B, CHARINDEX(';',B+';')-1) as varchar(100)),
CAST(STUFF(B, 1, CHARINDEX(';',B+';'), '') as varchar(100))
from split
where B > ''
), clr as (
select ID, substring(LTRIM(RTRIM(A)), charindex('@', LTRIM(RTRIM(A))) + 1, len(LTRIM(RTRIM(A)))) cleanEmail
--into #tempTbl
from split
), ccat as (
SELECT DISTINCT ST2.ID,
SUBSTRING(
(
SELECT ';'+ST1.cleanEmail AS [text()]
FROM clr ST1
WHERE ST1.ID = ST2.ID
ORDER BY ST1.ID
FOR XML PATH ('')
), 2, 1000) Emails
FROM clr ST2
)
select * from ccat
А вот некоторые объяснения того, как все это работает:
- Первое выражение CTE разбивает электронные письма на отдельные строки, используя
;
в качестве разделителя - Второе CTE основано на вашей функции удаления получателя с адреса электронной почты и выхода только из домена.
- Последний объединяет все обратно и использует тот же
;
в качестве разделителя. Не стесняйтесь добавлять дополнительные пробелы, если вы предпочитаете вывод.