Получение имени домена электронной почты (без TLD) на SQL Server - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь получить только доменное имя из Email1 столбца в Users таблице моей базы данных.

UserId   Email1
  1      abc@gmail.com
  2      xyz@google.com
  3      xyz@abc.com
  4      abc@xyz.com
  5      123@stackoverflow.com

Когда я запускаю этот запрос:

SELECT LEFT( RIGHT(Email1, LEN(Email1)-CHARINDEX('@', Email1)),   
CHARINDEX('.', RIGHT(Email1, LEN(Email1)-CHARINDEX('@', Email1)))) 
as EmailNamePart FROM Users 

Я получаю следующее:

gmail.
google.
abc.
xyz.
stackoverflow.

в то время как ожидаемый результат должен быть:

gmail
google
abc
xyz
stackoverflow

Любая подсказка, что не так в моем запросе?

Ответы [ 2 ]

1 голос
/ 17 мая 2019

Попробуйте:

- если вы хотите только до первой точки -

 select  SUBSTRING(Email1, CHARINDEX('@', Email1)+1,
 CHARINDEX('.', V.Email, CHARINDEX('@', Email1))-CHARINDEX('@', Email1)-1) as
 EmailNamePart FROM Users

- если вы хотите до последней точки -

select SUBSTRING(Email1, CHARINDEX('@', Email1)+1, 
(charindex('.', reverse(Email1) + '0') - len(Email1))*-1-(CHARINDEX('@', Email1)))
as EmailNamePart FROM Users
1 голос
/ 17 мая 2019

На основании вашего комментария "В этом случае я бы просто удалил от" @ "до первого". "" Это даст вам то, что вы хотите, но не уверены, что это то, что вы действительно хотите:

WITH VTE AS(
    SELECT *
    FROM (VALUES('abc@gmail.com'),
                ('xyz@google.com'),
                ('xyz@abc.com'),
                ('abc@xyz.com'),
                ('123@stackoverflow.com'),
                ('def@dba.stackexchange.com'),
                ('xx@msn.co.uk'),
                ('abc123@mail.yahoo.co.uk'))V(Email))
SELECT LEFT(D.Domain,CI.Extension-1) AS SubDomain
FROM VTE V
     CROSS APPLY (VALUES(STUFF(V.Email, 1,CHARINDEX('@',Email),'')))D(Domain)
     CROSS APPLY (VALUES(CHARINDEX('.',D.Domain)))CI(Extension);

Выход:

SubDomain
-----------
gmail
google
abc
xyz
stackoverflow
dba
msn
mail
...