2010-04-05 9 views
14

Ich versuche Zeilen zu finden, in denen das erste Zeichen keine Ziffer ist. Ich habe dies:MySql nicht wie Regexp?

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

Aber ich bin nicht sicher, wie Sie sicherstellen, überprüft er nur das erste Zeichen ...

Antwort

11

Ihre aktuellen Regex Werte übereinstimmen, bestehend aus genau einer Ziffer, nicht nur das erste Zeichen Entfernen Sie einfach die $ von dem Ende, das bedeutet "Ende des Wertes". Es wird nur das erste Zeichen überprüft, es sei denn, du sagst, dass es mehr prüfen soll.

^[:digit:] wird funktionieren, das bedeutet "Anfang des Werts, gefolgt von einer Ziffer".

+0

danke dafür! – TwixxyKit

20

Zuerst gibt es einen leichten Fehler in Ihrer Abfrage. Es sollte sein:

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

Beachten Sie die doppelten eckigen Klammern. Sie könnten umschreiben es auch als auch nach der leeren String-Matching zu vermeiden:

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

Beachten Sie auch, dass die Verwendung von REGEXP aus einem Index benutzt werden, und wird in einem Table-Scan oder Index-Scan zur Folge hat. Wenn Sie eine effizientere Abfrage möchten, sollten Sie versuchen, die Abfrage neu zu schreiben, ohne REGEXP zu verwenden, wenn es möglich ist:

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

Dann einen Index auf (Taste q, action) hinzuzufügen. Es ist nicht so angenehm zu lesen, aber es sollte eine bessere Leistung geben. Wenn Sie nur eine kleine Anzahl von Aktionen für jeden qkey haben, wird es wahrscheinlich keine merkliche Leistungssteigerung geben, so dass Sie bei der einfacheren Abfrage bleiben können.