SQL Server部分匹配

9 浏览
0 Comments

SQL Server部分匹配

我有两列数据,我想确定两个字符串之间是否存在部分匹配。列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。

0
0 Comments

问题:SQL Server部分匹配的原因是什么以及解决方法是什么?

原因:SQL Server部分匹配的原因是在比较字符串时,基于字符串的发音相似性进行比较,但对于包含数字的标识符等情况并不适用。

解决方法:可以使用DIFFERENCE函数来比较两个字符串的SOUNDEX值。如果差异为0,则表示没有相似性。如果差异为4,则表示非常相似。

代码示例:

DECLARE @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。也可以参考Stack Overflow的帖子“fuzzy matching in C#”。

更新:根据OP的确认,上述方法只在某些情况下有效。因此,OP必须找到一个更适合他所有需求的更好的方法。

感谢答案。我尝试了一下,有些地方效果很好,有些地方效果不好。在我的项目中,我肯定可以使用这个函数。谢谢。

在这种情况下,您可以使用CLR存储过程,利用C#模糊匹配来进行详细的模糊匹配,以满足您的需求。

如果这个回答解决了您的问题,请将其标记为答案,这将对其他人有帮助。

抱歉,我以为OP打算使用CLR方法来使用C#模糊逻辑来满足他的需求,并已接受了答案。我同意您的观点。我会给OP发送消息来撤销他的决定。

0