我的表中有一个以逗号分隔的电子邮件地址的列。在单个select语句中是否有一种方法可以解析它们并对它们进行分组?
在这样的表中:
ID Emails
1 email@domain.com, email2@domamin.com
2 email2@domain.com, email3@domain.com
返回类似的内容:
Email Count
email@domain 1
email2@domain.com 2
email3@domain.com 1
我知道我可以使用游标和临时表来执行此操作,但我不确定使用select和嵌套的select语句是否有一些巧妙的技巧。
提前致谢。
答案 0 :(得分:2)
您可以将电子邮件列表转换为XML,然后使用.nodes
和.value
查询XML。
declare @T table
(
ID int,
Emails varchar(100)
)
insert into @T values
(1, 'email@domain.com, email2@domain.com'),
(2, 'email2@domain.com, email3@domain.com')
select T.Email, count(*) as [Count]
from (
select X.N.value('.', 'varchar(30)') as Email
from @T
cross apply (select cast('<x>'+replace(Emails, ', ', '</x><x>')+'</x>' as xml)) as T(X)
cross apply T.X.nodes('/x') as X(N)
) as T
group by T.Email
结果:
Email Count
------------------------------ -----------
email@domain.com 1
email2@domain.com 2
email3@domain.com 1
答案 1 :(得分:0)
您的问题似乎与此问题中提出的问题非常相似:Turning a Comma Separated string into individual rows。
递归CTE,就像在那里一样,应该有效。
答案 2 :(得分:0)
我将不得不坐下来消化这一点,因为之前从未使用过MSSQL xml的东西,但是我把它更改为使用我的实际表名,它完美地工作,omg,非常感谢你。 这就是我所做的(如果有人想在没有像我这样的临时表的情况下使用它):
select T.Email, count(*) as [Count]
from (
select X.N.value('.', 'varchar(30)') as Email
from reports_schedule rs
cross apply (select cast('<x>'+replace(rs.recipient_email, ', ', '</x><x>')+'</x>' as xml)) as T(X)
cross apply T.X.nodes('/x') as X(N)
) as T
group by T.Email
再次感谢!