2016-01-09 33 views
1

我正在處理一個項目,該項目需要查找包含確切字符串或相同字符串作爲確切格式一部分的記錄。換句話說,如果字符串是「世界你好」,有可能是說... 10條記錄中有該字段值的數據庫,但該領域可能是下列之一:查找包含確切字符串的MySQL記錄

"1. hello world" 
"1 hello world" 
"hello world" 
"hello world (xyz)" 
"1. hello world (xyz)" 
"1 hello world (zyx)" 

字符串「hello world」可以是任何事情,但前綴總是以數字開頭或不存在,後綴總是以括號結尾或不存在。

我想我用下面的正則表達式破解它,但是這並不返回任何記錄:

WHERE fieldname REGEXP '^([0-9]+.*)?[[:<:]]hello world[[:>:]](.*\))?$' 

此外,我從來沒有用過[:<:]] [[:> :]]之前,並假設這是要走的路,我不知道如何逃避之間的文字,因爲這將是PHP生成的?該文件說,加倍逃避的反斜槓,所以我猜mysql_real_escape_string是不夠的...?

任何意見,將像往常一樣,非常感激。

+1

怎麼樣'LIKE'%hello world%''?請參閱[this](http://www.w3schools.com/sql/sql_like.asp) – pietv8x

+0

不幸的是,基本LIKE不夠,因爲我需要排除不符合此格式的記錄。例如「不同的hello world(xyz)」或「1. hello world two」 – Ric

+1

可以嘗試[像這樣](http://sqlfiddle.com/#!9/59f2c9/11/0)''^([0 -9]。*)?[[:<:] hello world($ | [[:>:]]。+ [)] $)'' –

回答

0

您可以嘗試將最後一部分[[:>:]](.*\))?$更改爲變通方法。

^([0-9].*)?[[:<:]]hello world($|[[:>:]].+[)]$) 

SQL Fiddle

如果不確定有關轉義,儘量把特殊字符爲字符類[)]see this question轉義字符串的動態部分。

+0

完全按照我期望的那樣工作,謝謝。令人討厭的是,一個REGEXP似乎比多個LIKE慢了大約4倍,畢竟這! http://pastebin.com/dcQTQENp – Ric

+0

@Ric你可以加上嘗試將第一部分'^([0-9]。*)?[[:<:]]'切換到'(^ |^[0- 9]。* [[:<:]]'沒有測試這是否會使用索引(使用EXPLAIN)。否則是 - 可能你需要分成幾個查詢來獲得更好的性能。 –

1

試試這個

WHERE fieldname LIKE '%hello world%' 

你可以閱讀更多關於 「LIKE」 here

+0

不幸的是,一個基本的LIKE是不夠的,因爲我需要排除不符合這種格式的記錄。例如「不同的你好世界(xyz)」或「1.你好世界二」 – Ric

+0

那麼你想要什麼? – Beardslapper

+0

這是工作,但它太慢,即使有索引。我希望用signle正則表達式替換。http://pastebin.com/dcQTQENp – Ric