我有一个包含以下行的示例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)
为单词的行?
答案 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[[:>:]]'