查询'@'之后的所有内容

时间:2019-10-02 20:39:59

标签: sql sql-server

我正在建立一个新查询,但是不幸的是,我陷入了SQL中的某种功能。我有一些包含特定电子邮件的记录。我想要的是带上@之后的所有内容。

例如:

cesarcastillo88@hotmail.com ==>结果,我应该得到以下内容:hotmail.com

这一点并不复杂,因为该记录仅显示一封电子邮件。

但是...该记录是否包含以下电子邮件:

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

对于那些在一条记录中只有1封电子邮件的情况,我做到了完美

我使用以下公式:

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

但是,我应该如何在一条记录中处理3封电子邮件?

我想要的结果如下:

hotmail.com ; gmail.com ; compliance.com

2 个答案:

答案 0 :(得分:1)

这是一个可能的解决方案,它基于以下假设:您有某种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是基于您的功能来从电子邮件地址中删除收件人并仅离开域
  • 最后一个将所有内容串联起来,并使用相同的;作为分隔符。如果这是您的首选输出,请随时在周围添加额外的空格。

答案 1 :(得分:0)

您没有说什么版本的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