我正在建立一个新查询,但是不幸的是,我陷入了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
答案 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
这是所有工作原理的解释:
;
作为分隔符将电子邮件分成单独的行;
作为分隔符。如果这是您的首选输出,请随时在周围添加额外的空格。答案 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