2016-06-28 31 views
1

我有這個表:帶括號的邊界Mysql的比賽的話

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。我試圖theese:

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) 

有沒有什麼解決辦法嗎?

+1

你必須使用正則表達式嗎?爲什麼不''SELECT * FROM test WHERE duma LIKE'%(ccc)%''? – Fredster

+0

對不起,我寫了不好的示例表數據。現在我糾正了它。 –

回答

1

您可以使用likeor覆蓋你想要的空間possibilites ...

SELECT * FROM test 
WHERE duma LIKE '(ccc) %' 
OR duma LIKE '% (ccc)' 
OR duma LIKE '% (ccc) %' 
2

對於這類詞搜索,你可以使用像

SELECT * FROM test WHERE duma like '%(ccc)%'; 
+0

由於OP不需要#7,8,9,因此無法工作。 –

+0

這不再正確。查看問題編輯。 – mickmackusa

1

你不需要REGEXP在這裏,你可以簡單地使用LIKE這種比較:

SELECT * FROM test 
WHERE duma LIKE '%(ccc)%'; 
+0

這不再正確。查看問題編輯。 – mickmackusa

1

逃生瘋狂之餘,一括號不是單詞字符,因此單詞邊界標記不匹配。從the manual

[[:<:]], [[:>:]] 

這些標記表示word邊界。它們分別與詞尾和詞尾相匹配。一個單詞是一個單詞字符序列,其前面或後面沒有單詞字符。 A word 字符是alnum類中的字母數字字符或 下劃線(_)

0
REGEXP '(^|)[(].*[)](|$)' 

,這大概比3 LIKEsOR更快。

你的「單詞」的定義是在任何一方有一個空格或字符串的開始/結束。這不是傳統的定義,所以到目前爲止(包括我的)給出的所有答案都不符合傳統的定義。