【问题标题】:Getting e-mail domain name (without TLD) on SQL Server在 SQL Server 上获取电子邮件域名(无 TLD)
【发布时间】:2019-10-04 21:41:34
【问题描述】:

我正在尝试从我的数据库的 Users 表中的 Email1 列中仅获取域名。

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 个扩展名的电子邮件地址呢? IE。 def@dba.stackexchange.comxxx@msn.co.uk 甚至 abc123@mail.yahoo.co.uk?你对这些有什么期望?将文本剥离到 ​​@ 并包括在内很容易,但您不能假设最后一个 . 之后的值是扩展名。
  • 好问题。在这种情况下,我只需从"@" 删除到它之后的第一个" . "。我想要的只是计算这些,过滤掉yahoo.seyahoo.inyahoo.com 之类的情况,只留下yahoo
  • 小心你使用它的目的。我可以轻松地创建一个 gmail.example.com 的电子邮件地址,您的解决方案将输出“gmail”。你不能对不完整的域名做出很多假设。
  • 感谢@Grax 的提示

标签: sql-server trim charindex


【解决方案1】:

试试这个:

-- 如果你只想到第一个点--

 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

【讨论】:

    【解决方案2】:

    根据您的评论 “在这种情况下,我只需从 "@" 删除到第一个 " 。 "" 这会让你得到你想要的,但不确定它是你真正想要的:

    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
    

    【讨论】:

    • 谢谢。我赞成你的答案,但选择凯文的答案更好,因为它没有 CTE。
    • @user102859 我的也不行; CTE 用于样本数据。我不得不something 来测试。 :)
    • 您应该在做出此类陈述之前进行测试@Kevin。以上将返回 'dba' 的值;正如 OP 所要求的那样。
    猜你喜欢
    • 2021-11-21
    • 1970-01-01
    • 2016-12-10
    • 2013-09-29
    • 2010-12-21
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多