【问题标题】:How to match columns in MySQL如何匹配 MySQL 中的列
【发布时间】:2009-10-15 19:11:03
【问题描述】:

每个人都知道“=”号。

SELECT * FROM mytable WHERE column1 = column2;

但是,如果我在 column1 和 column2 中的内容不同...但它们非常相似怎么办? (可能有一个空格,或者有一个不同的词)。

是否可以:

SELECT * FROM mytable WHERE ....column matches column2 with .4523423 "Score"...

我相信这叫做模糊匹配?还是模式匹配?这是它的技术术语。

编辑:我知道 Soundex 和 Levenstein 的距离。这是你推荐的吗?

【问题讨论】:

  • 我认为您可以使用 MATCH 命令并根据相关性建立一些东西.. 不过不太确定。
  • 您要查找的术语是编辑距离。通常实现为 Levenshtein 距离。

标签: python sql mysql string pattern-matching


【解决方案1】:

您要查找的内容称为Levenstein distance。它为您提供了描述两个字符串之间差异的数值。

在 MySQL 中,您必须为此编写存储过程。 Here 是可能有帮助的文章。

【讨论】:

  • 我知道我需要使用列文斯坦距离。但是,我该如何扩展呢?我有 4000 万行。如何有效地执行此操作或分发它,以免服务器崩溃?
  • Levenshtein (foo) 是谁?
【解决方案2】:

Lukasz Lysik 发布了对可以从数据库内部进行模糊匹配的存储过程的引用。如果您希望将此作为一项持续的任务来完成,那是您最好的选择。

但是,如果您想将其作为一次性任务执行,并且您可能想要进行复杂的检查,或者如果您想要执行一些复杂的操作来清理模糊匹配,您可能需要进行模糊匹配从 Python 内部。 (您的标签之一是“python”,所以我假设您对 Python 解决方案持开放态度......)

使用 Python ORM,您可以获得一个 Python 列表,其中每个数据库行一个对象,然后使用 Python 的全部功能来分析您的数据。您可以使用正则表达式、Python Levenstein 函数或其他任何东西。

Python 的全能最佳 ORM 可能是 SQLAlchemy。其实我更喜欢Django 的ORM;它有点简单,我重视简单。如果您的 ORM 需求并不复杂,那么 Django ORM 可能是一个不错的选择。如果有疑问,请转到 SQLAlchemy。

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-15
    • 2013-09-16
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 2015-05-05
    相关资源
    最近更新 更多