3

我有一个带有“clinicNo”字段的数据库,该字段包含诸如 1234A、2343B、9999Z 之类的记录......

如果我错误地使用“1234B”而不是“1234A”作为选择语句,我想得到一个结果集,其中包含与给定字符串仅相差一个字符的诊所编号(即上面的 1234B)

例如。字段可能包含以下值。1234A, 1235B, 5433A, 4444S, 2978C 如果我使用“1235A”进行选择查询,结果应该是 1234A 和 1235B。

4

4 回答 4

1

您正在寻找的是称为 Levenshtein 距离算法。虽然 PHP 中有一个levenshtein 函数,但您确实想在 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%,一半的 'term' = 2。在你的情况下,你可能会寻找差异< 2(即 1 个字符的差异),但您可以进一步解释其他错误。

另请参阅:维基百科:Levenshtein Distance

于 2013-01-08T08:48:10.137 回答
1

您可以使用 SUBSTRING 进行列选择,下面的示例返回 '1235' 和 'A to Z'

select *  from TableName WHERE SUBSTRING(clinicNo, 0, 5) LIKE '1235A'
于 2013-01-08T08:32:19.880 回答
0

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

要在 MySQL 中获取 Levenshtein,请阅读这篇文章

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

于 2013-01-08T08:49:06.920 回答
0
SELECT * FROM TABLE
WHERE ClinicNo like concat(LEFT(ClinicNo,4),'%')
于 2013-01-08T08:30:36.980 回答