在tsql中查找类似的字符串

时间:2016-07-20 14:05:39

标签: sql sql-server string

我目前正在研究sql server 2014中的日志系统,需要找到一种方法将类似的字符串分配到组中。每个字符串包含前缀,ID或Guid,然后是后缀。我想找到一种方法来查找我的表中是否已存在具有相同前缀和后缀的字符串。

典型的字符串可能如下所示:

'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'

'文件ID 19957 不存在'

'文件ID 1955 不存在'

我想根据Id / Guid值之前和之后出现的内容对邮件进行分组,因此上面的邮件将分为3组。

我考虑使用Levenshtein来查找相似的字符串,但是因为我知道所有的差异会相互关联(因为需要比较的字符串数量也会导致性能问题) )。问题是我不知道Guid / Id开始或结束的字符串在哪里。

1 个答案:

答案 0 :(得分: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
相关问题