【问题标题】:SQL Server Partial MatchSQL Server 部分匹配
【发布时间】:2021-07-28 06:10:18
【问题描述】:

我有 2 列试图查看两个字符串之间是否存在部分匹配。 A 列有字符串:0C000702AA-G,B 列有字符串 S0C000702AB-DI。我确实尝试过:

CASE WHEN ColumnA LIKE '%' + ColumnB + '%' THEN '1' ELSE '0' END AS 'Match'

但它返回一个 0。有没有更好的方法来查看是否几乎匹配?

A 列 = 0C000702AA-G,B 列 = S0C000702AB-DI。如您所见,B 列与 A 列几乎相同,B 具有前缀“S”并以“AB-DI”结尾。结果应该返回 1,因为中间 '0C000702AA' 的部分两边是相同的。

我刚刚测试过:

CASE WHEN '%' + ColumnA + '%' LIKE '%' + ColumnB + '%' THEN '1' ELSE '0' END AS 'Match'

仍然返回 0

【问题讨论】:

  • 这种逻辑永远不会起作用,因为 ColumnA 没有完全包含在 ColumnB 中。为了提出解决方案,您需要更准确地了解 ColumnA 中的字符串有多少需要匹配 ColumnB 的一部分。
  • 你的意思是我应该尝试子字符串匹配吗?我认为可行,但问题是并非所有代码的长度都相同。
  • 我不知道您应该尝试什么,直到您可以更具体地了解您的匹配要求。究竟什么才是“部分匹配”?
  • @RuanduPreez 。 . .因为您接受了答案,所以您劝阻了可能会帮助您回答的其他人。
  • @RuanduPreez,戈登是对的。由于我的回答没有直接回答您的问题,请不要接受我的回答,以便有人可能会提供更好的解决方案来帮助您。

标签: sql sql-server tsql


【解决方案1】:

您可以使用 DIFFERENCE 函数,它比较两个字符串的 SOUNDEX 值。如果差异为0,则没有相似性。如果差值为 4,则它们非常相似。 Read more about SOUNDEX and DIFFERENCE

CAVEAT:比较是基于琴弦的声音。因此,它不太适合您的需求,因为您有标识符之类的东西,包括数字。

DECLARE @table table(columnA CHAR(100), ColumnB CHAR(100))

INSERT INTO @table values 
('0C000702AA-G','S0C000702AB-DI')

SELECT SOUNDEX(ColumnA) as columnASoundex, SOUNDEX(columnB) as ColumnBSoundex, 
DIFFERENCE(ColumnA,ColumnB) as Similarity from @table
columnASoundex ColumnBSoundex Similarity
0000 S000 3

但是,如果您想进行更详细的比较,可以使用 CLR 存储过程,利用 C# 模糊匹配库,如 fuzzystring。另请参阅 SO 帖子fuzzy matching in C#

更新 正如 OP 所确认的,上述方法仅在某些情况下有效。所以,OP 必须想出一个更好的方法来满足他的所有需求。

【讨论】:

  • 感谢您的回答。我试过了,有些效果很好,有些不行。在我的项目中有一些地方我绝对可以使用这个功能。谢谢
  • @RuanduPreez,在这种情况下,您需要进行详细的模糊匹配,使用 CLR 存储过程来满足您使用 C# 模糊匹配的需求。
  • @RuanduPreez,当然。如果这回答了您的问题,请将其标记为答案,这将对以后的其他人有所帮助。
  • @VenkataramanR 。 . .这真是一个奇怪的建议,因为 OP 明确表示这在整体上不起作用。我不同意这个答案应该被接受。
  • @GordonLinoff,对不起。我认为 OP 将使用 C# 模糊逻辑的 CLR 方法来满足他的需求并接受了答案。我同意你的看法。我将向 OP 发送消息以恢复他的决定。
猜你喜欢
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
  • 1970-01-01
  • 2019-06-25
相关资源
最近更新 更多