Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在类似MYSQL的查询中忽略括号_Mysql_Sql_Sql Like - Fatal编程技术网

在类似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

我有一个示例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%'
它将正确地显示结果,但如果查询是字符串的一部分或返回数千个不相关的行,我不希望查询与文本匹配。这些单词必须是实际发现的单词,而不是单词的一部分。所以我必须在一年中有空间


在运行类似于的
时,是否有办法忽略括号,以便
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”是单独的信息(例如,产品的施工年份),则应将其存储为单独的属性。这不仅可以消除查询中的问题,还可以使查询遵循基本的关系原则。