在SQL中计算逗号分隔值

时间:2013-02-15 19:46:16

标签: csv sql-server-2008-r2 whitespace

表的SCHEMA / DATA:

SubscriberId NewsletterIdCsv
------------ ---------------
11           52,52,,52  

我们有这个非规范化数据,我需要计算逗号分隔值的数量,我这样做:

SELECT SUM(len(newsletteridcsv) - len(replace(rtrim(ltrim(newsletteridcsv)), ',','')) +1) as SubscribersSubscribedtoNewsletterCount
FROM TABLE
WHERE subscriberid = 11

结果:

SubscribersSubscribedtoNewsletterCount
--------------------------------------
4

问题是我们的一些数据在逗号分隔值之间有空格/空格,如果我运行上面的查询,预期结果应该是3(作为其中一个值是空格),我该如何检查我的查询以排除空格?

编辑:

数据:

SubscriberId NewsletterIdCsv
------------ ---------------
11           52,52,,52  
12           22,23

我需要得到一个累积的SUM而不是每行的总和,所以对于上面的数据,我需要有一个最终的数,即在这种情况下为5,不包括空格。

1 个答案:

答案 0 :(得分:1)

这是一个解决方案,尽管它们可能是一种更有效的方式:

SELECT A.[SubscriberId],  
  SUM(CASE WHEN Split.a.value('.', 'VARCHAR(100)') = '' THEN 0 ELSE 1 END) cnt
FROM  
(
   SELECT [SubscriberId],  
     CAST ('<M>' + REPLACE(NewsletterIdCsv, ',', '</M><M>') + '</M>' AS XML) AS String  
   FROM  YourTable
) AS A 
CROSS APPLY String.nodes ('/M') AS Split(a)
GROUP BY A.[SubscriberId]

SQL Fiddle

基本上它将您的NewsletterIdCsv字段转换为XML,然后使用CROSS APPLY拆分数据。最后,使用CASE查看是否为空,SUM为非空值。或者,您可以构建一个UDF来执行类似的操作。