在类似MYSQL的查询中忽略括号
我有一个示例MYSQL表,其中包含以下行:在类似MYSQL的查询中忽略括号,mysql,sql,sql-like,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 na
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%'
它将正确地显示结果,但如果查询是字符串的一部分或返回数千个不相关的行,我不希望查询与文本匹配。这些单词必须是实际发现的单词,而不是单词的一部分。所以我必须在一年中有空间
在运行类似于的
时,是否有办法忽略括号,以便2018
例如将(2018)
作为单词匹配行?一种方法是正则表达式。但使用类似于
的,您可以在匹配之前替换参数:
SELECT *
FROM phones
WHERE REPLACE(REPLACE(name, '(', ' '), ')', ' ') LIKE '% 2018 %'
您可以结合或
检查两种情况以检查这两种情况。尝试:
SELECT * FROM phones
WHERE name LIKE '% 2018 %' OR
name LIKE '%(2018)%'
虽然Gordon Linoff提供的答案肯定会起作用,但当数据集增长时,它不会表现得很好,更好的方法是在表上使用全文搜索,这应该可以更轻松地处理此类问题。您可以使用正则表达式将2018本身看作一个单词。只需在其周围使用单词边界元素:
SELECT *
FROM phones
WHERE name REGEXP '[[:<:]]2018[[:>:]]'
选择*
从电话
其中名称REGEXP'[[::]]'
需要考虑的其他事项:如果“2018”是单独的信息(例如,产品的施工年份),则应将其存储为单独的属性。这不仅可以消除查询中的问题,还可以使查询遵循基本的关系原则。