忽略 MYSQL Like 查询中的括号

Ignore parentheses in MYSQL Like query

我有一个示例 MYSQL table,其中包含以下行:

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 %'

它 return 什么都不会,因为 2018 存储在数据库中,周围有括号。

如果我将查询切换为:

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

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

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

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

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

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

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

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

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

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