Запросить все, что идет после '@' - PullRequest
2 голосов
/ 02 октября 2019

Я настраиваю новый запрос, но, к сожалению, я застрял в некоторых функциях SQL. У меня есть несколько записей с конкретными электронными письмами. Все, что я хочу - это принести все, что идет после «@».

Например:

cesarcastillo88@hotmail.com ==> в результате я должен получить следующее: hotmail.com.

Это было совсем не сложно из-за того, что запись показывает только одно электронное письмо.

Но ... что если эта запись включает следующие электронные письма:

cesarcastillo88@hotmail.com ; laura23@gmail.com ; test@compliance.com

Я сделал это идеально для тех случаев, когда в одной записи было только 1 электронное письмо

Iиспользовал следующую формулу:

substring(**columnName**, charindex('@', sfe.**columnName**), len(sfe.**columnName**))

Однако как мне сделать это с 3 электронными письмами в одной записи?

Мой желаемый результат следующий:

hotmail.com ; gmail.com ; compliance.com

Ответы [ 2 ]

1 голос
/ 03 октября 2019

Вот возможное решение, основанное на предположении, что у вас есть какой-то столбец 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 основано на вашей функции удаления получателя с адреса электронной почты и выхода только из домена.
  • Последний объединяет все обратно и использует тот же ; в качестве разделителя. Не стесняйтесь добавлять дополнительные пробелы, если вы предпочитаете вывод.
0 голосов
/ 03 октября 2019

Вы не говорите, какая версия SQL Server, но я предполагаю, 2016 или более поздней версии. Их ключом является функция STRING_SPLIT. Чтобы присоединить его к своим данным, вам нужно использовать CROSS APPLY.

create table #a (
    id int identity(1,1),
    email varchar(max)
)

insert #a
values ('cesarcastillo88@hotmail.com ; laura23@gmail.com ; test@compliance.com')
, ('dannyboy@irish.com')


select id
, email
, substring(email, CHARINDEX('@', email) + 1, len(email)) as domain
from #a


select a.id
, substring(ltrim(rtrim(b.value)), CHARINDEX('@', ltrim(rtrim(b.value))) + 1, len(ltrim(rtrim(b.value)))) as domain
from #a a
  cross apply string_split(email, ';') b
drop table #a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...