计算列上的子字符串出现次数

时间:2014-06-30 19:44:48

标签: sql sql-server sql-server-2008

我有一个带有ID和nvarchar字段的表。

在每一行我都有类似的东西:

ID   ClientID    TEXT
6       1          'Log Entry A' - 26/05/2014 17:32:30; - UserName 'Log Entry B' - 27/05/2014 18:30:30; - UserName
7       2          'Log Entry 2A' - 27/05/2014 17:32:30; - UserName 'Log Entry 2B' - 27/05/2014 18:32:30; - UserName

此处的TEXT字段是一个NVARCHAR列,用于保存给定日期的所有与客户端相关的用户活动(例如:2014年5月27日当天用户UserName的所有用户活动)

问题是:我需要弄清楚用户" UserName"在每一行都登录了一项活动。

到现在为止,我认为使用这样的东西:

(...) WHERE TEXT LIKE '%27/05/2014_____________UserName%'

我可以忽略小时并抓住所有具有我想要日期的列。但是,这并没有解决我的问题:这只是在用户登录时给出,但我仍然需要知道用户当天登录的次数。

我想从中得到类似的东西:

SELECT ID, CountSubstrings(TEXT, '%27/05/2014_____________UserName%') as Count, TEXT
FROM ClientData WHERE TEXT LIKE '%27/05/2014_____________UserName%' 

结果会给我这个:

ID    Count   TEXT
 6    1   'Log Entry A' - 26/05/2014 17:32:30; - UserName 'Log Entry B' - 27/05/2014 18:30:30; - UserName
 7    2   'Log Entry 2A' - 27/05/2014 17:32:30; - UserName 'Log Entry 2B' - 27/05/2014 18:32:30; - UserName

任何想法?

3 个答案:

答案 0 :(得分:1)

这是一种方法,假设用户名被空格包围:

select t.*,
       ((len(' ' + text + ' ') -
         len(replace(' ' + text + ' ', ' ' + @UserName + ' ', ''))
        ) / (2 + len(@UserName)) -- the "2" is for the spaces at the beginning and end
       ) as NumberOfTimes 
from table t;

答案 1 :(得分:1)

<强> SQL Fiddle Demo

DECLARE @SearchFilter nvarchar(max) = '%27/05/2014%'

SELECT
  [ClientID],
  COUNT(*) [count]
FROM ClientData t1
CROSS APPLY(SELECT CAST('<a>'+REPLACE([TEXT],';','</a><a>')+'</a>' AS xml)) t2(xml)
CROSS APPLY xml.nodes('a') t3(log_entry)
WHERE log_entry.value('.','nvarchar(max)') LIKE @SearchFilter
GROUP BY ClientID

答案 2 :(得分:0)

一种干净的方法是编写一个SQL scalar-valued user defined function代码,它返回你想要在提供的字符串中找到的子字符串的数量(一个带有2个参数并进行计数的函数)。