【问题标题】:How to find records in a database which differ only from one character to the search string?如何在数据库中查找仅与搜索字符串一个字符不同的记录?
【发布时间】:2013-01-08 08:24:52
【问题描述】:

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

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

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

【问题讨论】:

  • 你的行中是否总是有 4 个数字和 1 个字符?
  • 没有。实际上我的数字格式有点复杂。真实诊所编号示例:ABC/2013/1234 (//)

标签: php mysql string


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您要查找的内容称为 Levenshtein 距离算法。虽然有 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%,一半的 'term' = 2。在你的情况下,你可能会寻找 &lt; 2 的差异(即 1 个字符差异),但您可以进一步解释其他错误。

    另见:Wikipedia: Levenshtein Distance

    【讨论】:

      【解决方案3】:
      SELECT * FROM TABLE
      WHERE ClinicNo like concat(LEFT(ClinicNo,4),'%')
      

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多