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

时间:2013-01-08 08:24:52

标签: php mysql string

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

如果我错误地使用'1234B'而不是'1234A'作为select语句,我想得到一个包含clinicNos的结果集,它只与给定字符串的一个字符不同(即上面的1234B)< / p>

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

4 个答案:

答案 0 :(得分:1)

您可以使用SUBSTRING进行列选择,例如使用'A to Z'返回'1235'

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

答案 1 :(得分:1)

您正在寻找的是Levenshtein Distance算法。虽然有levenshtein function in PHP,但你真的想在MySQL中这样做。

在MySQL中实现Levenshtein函数有两种方法。第一种是创建一个STORED FUNCTION,它的运行方式与STORED TRANSACTION非常相似,只是它具有不同的输入和输出。这适用于小型数据集,但对于接近数千行的任何内容都有点慢。您可以在此处找到更多信息:http://kristiannissen.wordpress.com/2010/07/08/mysql-levenshtein/

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

使用这些方法之一,您的查询将类似于:

SELECT clinicNo FROM words WHERE levenshtein(clinicNo, '1234A') < 2;

重要的是要记住'阈值'值应该相对于原始字长而改变。最好用百分比值来考虑它,即你的一半词= 50%,“一词”的一半= 2.在你的情况下,你可能会寻找< 2的差异(即a 1个字符差异),但您可以进一步考虑其他错误。

另见:Wikipedia: Levenshtein Distance

答案 2 :(得分:0)

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

答案 3 :(得分:0)

在一般开发中,你可以使用像Levenshtein这样的函数来找到两个字符串之间的差异,它会返回一些“它们有多相似”。您可能希望结果具有最大的相似性。

要在MySQL中获得Levenshtein,请阅读this post

或者只是获取所有结果并使用the Levenshtein function of PHP