需要激怒的sql语句帮助

时间:2011-12-19 16:27:36

标签: sql-server-2008

我的表中有一个以逗号分隔的电子邮件地址的列。在单个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语句是否有一些巧妙的技巧。

提前致谢。

3 个答案:

答案 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 

再次感谢!