SQL Server部分匹配
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。
问题: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发送消息来撤销他的决定。