2016-07-20 5 views
0

В настоящее время я работаю над системой ведения журнала на сервере sql 2014 и должен найти способ присвоить аналогичные строки в группы. Каждая строка содержит префикс, идентификатор или указатель, а затем суффикс. Я хотел бы найти способ найти, если в моей таблице уже есть строки с тем же предварительным и суффиксом.Поиск похожих строк в tsql

Типичная строка может выглядеть следующим образом:

'ApsisQueue.Synchronize @ApiKey = AA24FA75-CB78-451E-A11F-39115ABF8AA1, @CallbackId = 1'

Или

«ApsisQueue .Synchronize @ApiKey = AA24FA75-CB78-451E-A11F-39115ABF8AA1, LogMessage = NULL»

Или

'ApsisQueue.Synchronize @ApiKey = BC2CFC45-CB78-411E-A66F-3CC654AB125, LogMessage = NULL'

Или

'File ID не существует'

Или

'File ID не существует'

Я хотел бы сгруппировать сообщения в зависимости от того, что появляется до и после значений Id/Guid, поэтому вышеприведенные сообщения будут сгруппированы в 3 группы.

Я нашел использование Levenshtein, чтобы найти похожие строки, но, похоже, немного перебор, так как я знаю, что все различия будут следовать друг за другом (это также приводит к проблемам с производительностью из-за количества строк, которые необходимо сравнить). Проблема в том, что я не знаю, где в строке начинается/заканчивается Guid/Id.

+2

Можете ли вы добавить некоторые примеры данных и объяснить вместе с ним – TheGameiswar

+1

«Проблема заключается в том, что я не знаю, где в струны Guid/Id начинается или заканчивается.» Мы тоже. Мы даже не знаем, как выглядит строка. –

+0

Добавлено несколько примеров типичных строк, которые появятся в журнале – Kull

ответ

0

Не уверен, что вы пытаетесь выполнить, но я подозреваю, что как только вы выясните, как изолировать ключевые значения, с которыми вы работаете, вы можете двигаться вперед. Это работает с вашими примерными данными. Если у вас есть другие шаблоны, это может не сработать.

create table #Something 
(
    SomeString varchar(200) 
) 

insert #Something (SomeString) values 
('ApsisQueue.Synchronize @ApiKey = AA24FA75-CB78-451E-A11F-39115ABF8AA1, @CallbackId = 1') 
,('ApsisQueue.Synchronize @ApiKey = AA24FA75-CB78-451E-A11F-39115ABF8AA1, LogMessage = NULL') 
,('ApsisQueue.Synchronize @ApiKey = BC2CFC45-CB78-411E-A66F-3CC654AB125, LogMessage = NULL') 
,('File id19957 does not exist') 
,('File id1955 does not exist') 


select * 
    , Case when SomeString like 'ApsisQueue%' 
     then SUBSTRING(SomeString, charindex('=', SomeString) + 2, CHARINDEX(',', SomeString) - charindex('=', SomeString) - 2) 
     else left(SUBSTRING(SomeString, 8, 200), charindex(' ', SUBSTRING(SomeString, 8, 200)) - 1) 
    end as YourKeyValue 
from #Something 

drop table #Something 
Смежные вопросы