【问题标题】:Finding similar strings in tsql在sql中查找相似的字符串
【发布时间】:2016-07-20 14:05:38
【问题描述】:

我目前正在使用 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'

或者

'文件 ID19957 不存在'

或者

'文件 ID1955 不存在'

我想根据 Id/Guid 值前后出现的内容对消息进行分组,因此上述消息将分为 3 组。

我考虑过使用Levenshtein 来查找相似的字符串,但这似乎有点矫枉过正,因为我知道所有差异都会相互影响(由于需要比较的字符串数量,它也会导致性能问题)。问题是我不知道 Guid/Id 在字符串中的哪个位置开始或结束。

【问题讨论】:

  • 能否请您添加一些示例数据并解释一下
  • “问题是我不知道 Guid/Id 在字符串中从哪里开始或结束。”我们也没有。我们甚至不知道字符串长什么样。
  • 添加了一些将出现在日志中的典型字符串示例
  • 所以你有两种截然不同的精确模式?使用 substring 和 charindex 应该很容易隔离。

标签: sql sql-server string


【解决方案1】:

不太确定您要完成什么,但我怀疑一旦您弄清楚如何隔离您正在使用的关键值,您就可以继续前进。这适用于您的示例数据。如果您有其他模式,这可能不起作用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-20
    • 2022-12-10
    • 2016-03-07
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多