我試圖找到第一個字符不是數字的行。我有這樣的:MySql不是正則表達式?
SELECT DISTINCT(action) FROM actions
WHERE qkey = 140 AND action NOT REGEXP '^[:digit:]$';
但是,我不知道如何確保它只是檢查的第一個字符...
我試圖找到第一個字符不是數字的行。我有這樣的:MySql不是正則表達式?
SELECT DISTINCT(action) FROM actions
WHERE qkey = 140 AND action NOT REGEXP '^[:digit:]$';
但是,我不知道如何確保它只是檢查的第一個字符...
您當前的正則表達式匹配值由恰好有一個數字的,不只有第一個字符。只需從結尾刪除$
即意味着「價值終結」。它只會檢查第一個字符,除非您告訴它檢查更多。
^[:digit:]
會的工作,這意味着「價值的開始,後面跟着一個數字」。
首先在查詢中有一個小錯誤。它應該是:
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只有少量動作,那麼它可能不會帶來任何明顯的性能提升,因此您可以堅持使用更簡單的查詢。
感謝您的支持! – TwixxyKit 2010-04-05 16:29:36