【问题标题】:How to perform a MySQL search that ignores punctuation in table data如何执行忽略表数据中标点符号的 MySQL 搜索
【发布时间】:2021-02-21 07:14:06
【问题描述】:

我有多个包含大量文本的表格。 文本中有很多标点符号。

MY_TABLE
|ID|       TEXT        |
------------------------
|1 |Dr. John Smith, FNP|

如果我搜索:

SELECT * FROM `MY_TABLE` WHERE `TEXT` LIKE '%Dr. John Smith, FNP%'

返回第 1 行。

如果我搜索:

SELECT * FROM `MY_TABLE` WHERE `TEXT` LIKE '%Dr John Smith FNP%'

返回 0 行。

如何执行忽略数据中的标点符号的搜索?

我必须一次搜索多个表,每个表包含数十万行,都包含文本段落。

所以 - 速度将是一个问题。

【问题讨论】:

    标签: mysql punctuation


    【解决方案1】:

    您可以在 MySQL 8+ 上使用 REGEXP_REPLACE 以简洁的方式从 TEXT 列中删除标点符号:

    SELECT *
    FROM MY_TABLE
    WHERE REGEXP_REPLACE('[,.;:]+', '', TEXT) LIKE '%Dr John Smith FNP%';
    

    这是一种相当干净的方法,因为如果事实证明您需要删除额外的标点符号,您只需将它们添加到正则表达式模式的字符类中。

    【讨论】:

    • 这似乎是一个不错的解决方案 - 但是担心这将花费大量文本列、许多行和多个表所花费的时间是否合理?
    • @Stnfordly 您的性能问题是有效的,在这种情况下考虑使用其他答案(尽管 either 解决方案通常不会很快)。
    【解决方案2】:

    作为第一个选项,您可以尝试替换不需要的字符

        SELECT * FROM `MY_TABLE` 
        WHERE REPLACE(REPLACE( `TEXT`, ',',''),'.','') 
            LIKE '%Dr John Smith FNP%'
    

    或使用多个通配符

    SELECT 'OK'  FROM  dual WHERE 'Dr. John Smith, FNP' LIKE '%Dr%John%Smith%FNP%'
    

    .

    SELECT * FROM  `MY_TABLE`  WHERE 'Dr. John Smith, FNP' LIKE '%Dr%John%Smith%FNP%'
    

    最后你可以使用 REGEX_REPLACE

    WHERE REGEXP_REPLACE('[,.]+', '', `TEXT`) LIKE '%Dr John Smith FNP%';
    

    【讨论】:

      猜你喜欢
      • 2017-05-05
      • 2014-03-31
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多