请考虑以下记录:
- 无名氏
- Gohn Doe
- 彼得·阿尔蒙德
- Anna Lee
- Danna Lee
- Simon Clark
- Don Doe
我一直在尝试设计一个SQL Select语句,该语句将只检索具有某些相似性的记录(分数待定(。在上面的例子中,预期的查询应该返回行1,2,5,6和8。我尝试过查看MATCH AGAINST
、LEVENSHTEIN
,但这些函数在提供输入的搜索中起作用。在我的情况下,没有提供任何输入。我正在努力实现的是检测整个表中的重复记录。
您需要进行自联接来比较记录对。这是一把小提琴:https://www.db-fiddle.com/f/ghkCVASHTsw5pfyySEQ9G4/0
SELECT a.name, b.name
FROM tbl a
JOIN tbl b ON a.name > b.name
WHERE compare(a.name, b.name) < threshold
compare(a,b)
是您选择的比较函数。你可以使用字符串之间的Levenstein距离。或者您可以使用SOUNDEX(a.name) = SOUNDEX(b.name)
。或者任何其他可以进行模糊比较的东西。
示例中的ON
子句避免了重复比较和自比较。