我有一个带有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
任何想法?
答案 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个参数并进行计数的函数)。