如何在数据库中查找与搜索字符串仅不同于一个字符的记录


How to find records in a database which differ only from one character to the search string?

我有一个数据库字段'clinicNo',该字段包含1234A, 2343B, 9999Z等记录......

如果我错误地使用'1234B'而不是'1234A'作为选择语句,我想获得一个结果集,其中包含clinicno,这些clinicno与给定字符串(即。1234 b)

。字段可能包含以下值。1234a, 1235b, 5433a, 4444s, 2978c如果我使用'1235A'作为选择查询,它应该给出1234A和1235B作为结果。

您可以为您的列选择使用SUBSTRING,下面的示例返回'1235'与'A到Z'

select *  from TableName WHERE SUBSTRING(clinicNo, 0, 5) LIKE '1235A'

你要找的是所谓的Levenshtein距离算法。虽然PHP中有一个levelshtein函数,但你真的想在MySQL中这样做。

在MySQL中有两种实现Levenshtein函数的方法。第一种方法是创建一个STORED FUNCTION,它的操作与STORED TRANSACTION非常相似,只是它有不同的输入和输出。这对于小型数据集很好,但是对于接近几千行的数据集就有点慢了。你可以在这里找到更多信息:http://kristiannissen.wordpress.com/2010/07/08/mysql-levenshtein/

第二种方法是在C/c++中实现一个用户定义函数,并将其链接到MySQL中作为共享库(*)。所以文件)。该方法还使用STORED FUNCTION调用库,这意味着对该方法或第一个方法的实际查询可能是相同的(提供两个函数的输入是相同的)。您可以在这里找到有关此方法的更多信息:http://samjlevy.com/2011/03/mysql-levenshtein-and-damerau-levenshtein-udfs/

使用这两种方法中的任何一种,您的查询将类似于:
SELECT clinicNo FROM words WHERE levenshtein(clinicNo, '1234A') < 2;

重要的是要记住,"阈值"值应该相对于原始单词长度而变化。最好以百分比值的形式来考虑,例如,单词的一半= 50%,"term"的一半= 2。在您的情况下,您可能会寻找< 2的差异(即1个字符的差异),但您可以进一步解释额外的错误。

参见:Wikipedia: Levenshtein Distance

SELECT * FROM TABLE
WHERE ClinicNo like concat(LEFT(ClinicNo,4),'%')

在一般的开发中,您可以使用像Levenshtein这样的函数来查找两个字符串之间的差异,并返回一些"它们有多相似"。你可能想要最相似的结果。

要了解Levenshtein也在MySQL,请阅读这篇文章。

或者直接获取所有结果并使用PHP的Levenshtein函数