2010-04-05 37 views
14

我試圖找到第一個字符不是數字的行。我有這樣的:MySql不是正則表達式?

SELECT DISTINCT(action) FROM actions 
WHERE qkey = 140 AND action NOT REGEXP '^[:digit:]$'; 

但是,我不知道如何確保它只是檢查的第一個字符...

回答

11

您當前的正則表達式匹配值由恰好有一個數字的,不只有第一個字符。只需從結尾刪除$即意味着「價值終結」。它只會檢查第一個字符,除非您告訴它檢查更多。

^[:digit:]會的工作,這意味着「價值的開始,後面跟着一個數字」。

+0

感謝您的支持! – TwixxyKit 2010-04-05 16:29:36

20

首先在查詢中有一個小錯誤。它應該是:

NOT REGEXP '^[[:digit:]]' 

請注意雙方括號。你也可以把它改寫爲以下,以避免也匹配空字符串:

REGEXP '^[^[:digit:]]' 

另外請注意,使用REGEXP防止指數被使用,將導致表掃描或索引掃描。如果你想要一個更有效的查詢,你應該嘗試重寫查詢,而無需使用REGEXP如果可能的話:

SELECT DISTINCT(action) FROM actions 
WHERE qkey = 140 AND action < '0' 
UNION ALL 
SELECT DISTINCT(action) FROM actions 
WHERE qkey = 140 AND action >= ':' 

然後在(qkey,動作)添加索引。閱讀並不令人愉快,但它應該會帶來更好的表現。如果每個qkey只有少量動作,那麼它可能不會帶來任何明顯的性能提升,因此您可以堅持使用更簡單的查詢。