我有这张桌子:
mysql> SELECT * FROM test;
+----+---------------+
| id | duma |
+----+---------------+
| 1 | bbb ccc ddd |
| 2 | bbb (ccc) ddd |
| 3 | ccc ddd eee |
| 4 | (ccc) ddd eee |
| 5 | aaa bbb ccc |
| 6 | aaa bbb (ccc) |
| 7 | bbb(ccc)ddd |
| 8 | (ccc)dddeee |
| 9 | aaabbb(ccc) |
+----+---------------+
9 rows in set (0.00 sec)
我想将“(ccc)”字符串仅作为单词匹配,所以我希望在结果中看到行#2,#4和#6。我试过了这个:
mysql> SELECT * FROM test WHERE duma REGEXP '[[:<:]](ccc)[[:>:]]';
+----+---------------+
| id | duma |
+----+---------------+
| 1 | bbb ccc ddd |
| 2 | bbb (ccc) ddd |
| 3 | ccc ddd eee |
| 4 | (ccc) ddd eee |
| 5 | aaa bbb ccc |
| 6 | aaa bbb (ccc) |
| 7 | bbb(ccc)ddd |
| 8 | (ccc)dddeee |
| 9 | aaabbb(ccc) |
+----+---------------+
9 rows in set (0.00 sec)
好的,括号是模式字符,我试图逃避它:
mysql> SELECT * FROM test WHERE duma REGEXP '[[:<:]]\\(ccc\\)[[:>:]]';
Empty set (0.00 sec)
mysql> SELECT * FROM test WHERE duma REGEXP '[[:<:]][(]ccc[)][[:>:]]';
Empty set (0.00 sec)
有没有解决方案?
答案 0 :(得分:2)
对于这种单词搜索,您可以使用
SELECT * FROM test WHERE duma like '%(ccc)%';
答案 1 :(得分:1)
您在这里不需要{{coeff(NS)...}};
,您只需使用LIKE
进行此比较:
REGEXP
答案 2 :(得分:1)
除了疯狂之外,括号不是单词字符,因此单词边界标记将不匹配。来自the manual:
[[:<:]], [[:>:]]
这些标记代表字边界。他们匹配开头和 词尾,分别。一个单词是一系列单词字符 不在单词字符之前或之后的单词字符。 一个字 character是alnum类中的字母数字字符或 下划线(_)。
答案 3 :(得分:1)
您可以like
使用or
来覆盖您想要的空间......
SELECT * FROM test
WHERE duma LIKE '(ccc) %'
OR duma LIKE '% (ccc)'
OR duma LIKE '% (ccc) %'
答案 4 :(得分:0)
REGEXP '(^| )[(].*[)]( |$)'
这可能比3 OR
的{{1}}快。
你对“单词”的定义是在两边都有一个空格或字符串的开头/结尾。这不是传统的定义,因此到目前为止给出的所有答案(包括我的)都不符合传统的定义。