忽略MYSQL Like查询中的括号

时间:2018-09-28 12:08:46

标签: mysql sql sql-like

我有一个包含以下行的示例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存储在数据库中并带有括号。

如果我将查询切换到:

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

它将正确显示结果,但我不希望查询与文本匹配,如果它是字符串的一部分,否则将返回数千个不相关的行。单词实际上必须是不属于单词的单词。所以我一年四季必须有空位。

运行LIKE时是否有一种方法可以忽略括号,从而使2018匹配以(2018)为单词的行?

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

您可以将两个条件与OR结合使用以检查这两种情况。试试:

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

答案 2 :(得分:1)

尽管Gordon Linoff提供的答案肯定会奏效,但是当您的数据集增长时,它的效果将不佳,一种更好的方法是在表上使用全文本搜索,这样应该可以更轻松地处理此类问题。

答案 3 :(得分:1)

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

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