Подсчитайте количество входящих подстрок в столбце

У меня есть таблица с идентификатором и поле 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, который содержит все действия пользователя, связанные с клиентом, в определенный день (например: все действия пользователя от пользователя UserName в день 27/05/2014)

Проблема заключается в следующем: мне нужно выяснить, сколько раз пользователь «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 

Есть идеи?

Вот один подход, предполагая, что имя пользователя окружено пробелами:

 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; 

Демо-версия SQL Fiddle

 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 

Чистым способом было бы кодировать SQL-функцию , определенную пользователем, которая возвращает счетчик подстроки, которую вы хотите найти в предоставленной строке (функция, которая принимает 2 параметра и выполняет подсчет).

Interesting Posts

Почему этот код Entity Framework не сохраняется в базе данных?

SQL Server: несколько табличных объединений с одним или несколькими предложениями WHERE

Таблица рейтинга по одному столбцу при сортировке по другой

Построитель отчетов / SSRS и RDL – поддержка HTML <img>?

Выполнение различных апробаций для временных данных

Неправильный синтаксис около оператора IF

Стол для сводной таблицы отсутствует

Должны ли все подзапросы заменяться временными таблицами?

Запрос Entity Framework 6 генерирует исключение NullReferenceException

Отправить файл Bad Data в качестве почтового приложения, только если у него есть записи –SSIS

Каков самый простой, но прочный интерфейс от WinForms к базе данных SQL Server?

Печать отчета Несколько раз (службы отчетности SSRS)

SSRS: проблемы с пустыми столбцами

Самый простой способ заполнить рабочий день

Простой начинающий триггер Запретить удаление

Давайте будем гением компьютера.