【问题标题】:Ignore parentheses in MYSQL Like query忽略 MYSQL Like 查询中的括号
【发布时间】:2018-09-28 12:08:45
【问题描述】:

我有一个包含以下行的示例 MYSQL 表:

name
------
Oppo A71 (2018)
Plum Flipper (2018)
Lenovo K5 Note (2018)
Huawei Y9 (2018)
Huawei Y7 (2018)

我想让用户搜索数据库。问题在于,在大多数情况下,用户会搜索关键字 2018,而不是 samsung a8 2018 等括号,而不是 samsung a8 (2018)。

所以对于下面的查询:

SELECT * FROM phones WHERE name LIKE '% 2018 %'

它不会返回任何内容,因为 2018 存储在 db 中并带有括号。

如果我将查询切换到:

SELECT * FROM phones WHERE name LIKE '%2018%'

它将正确显示结果,但如果它是字符串的一部分,或者会返回数千个不相关的行,我不希望查询与文本匹配。这些词必须是实际发现的词,而不是词的一部分。所以我必须全年都有空位。

有没有办法在运行 LIKE 时忽略括号,以便 2018 例如匹配以 (2018) 作为单词的行?

【问题讨论】:

  • 需要考虑的其他事项:如果“2018”是单独的信息(例如产品的建造年份),则应将其存储为单独的属性。这不仅会消除您的查询问题,而且会使其符合基本的关系原则。

标签: mysql sql sql-like


【解决方案1】:

一种方法是正则表达式。但是使用like,您可以在匹配之前替换括号:

SELECT *
FROM phones
WHERE REPLACE(REPLACE(name, '(', ' '), ')', ' ') LIKE '% 2018 %'

【讨论】:

    【解决方案2】:

    您可以检查两个条件并结合OR 来检查这两种情况。试试:

    SELECT * FROM phones 
    WHERE name LIKE '% 2018 %' OR
          name LIKE '%(2018)%'
    

    【讨论】:

      【解决方案3】:

      您可以使用正则表达式来单独查找 2018 作为一个词。只需在其周围使用单词边界元素即可:

      SELECT *
      FROM phones
      WHERE name REGEXP '[[:<:]]2018[[:>:]]'
      

      【讨论】:

        【解决方案4】:

        虽然 Gordon Linoff 提供的答案肯定会奏效,但当您的数据集增长时,它的表现不会很好,更好的方法是在您的表上使用全文搜索,这样可以更轻松地处理这类问题。

        【讨论】:

          猜你喜欢
          • 2021-03-30
          • 2023-03-14
          • 1970-01-01
          • 1970-01-01
          • 2018-07-19
          • 2011-05-05
          • 1970-01-01
          • 1970-01-01
          • 2012-12-08
          相关资源
          最近更新 更多