2010-04-05 12 views
14

Tôi đang cố gắng tìm các hàng có ký tự đầu tiên không phải là chữ số. Tôi có điều này:MySql Không thích Regexp?

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

Nhưng, tôi không chắc chắn làm thế nào để chắc chắn rằng nó sẽ kiểm tra chỉ là ký tự đầu tiên ...

Trả lời

11

regex hiện tại của bạn sẽ phù hợp với giá trị bao gồm đúng một chữ số, không ký tự đầu tiên. Chỉ cần xóa $ từ cuối của nó, điều đó có nghĩa là "kết thúc giá trị". Nó sẽ chỉ kiểm tra ký tự đầu tiên trừ khi bạn yêu cầu nó kiểm tra thêm.

^[:digit:] sẽ hoạt động, có nghĩa là "bắt đầu giá trị, theo sau là một chữ số".

+0

cảm ơn vì điều này! – TwixxyKit

20

Trước tiên, có một lỗi nhỏ trong truy vấn của bạn. Nó phải là:

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

Lưu ý dấu ngoặc kép vuông. Bạn cũng có thể viết lại như sau để tránh khớp với chuỗi trống:

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

Cũng lưu ý rằng việc sử dụng REGEXP sẽ ngăn không cho sử dụng chỉ mục và quét bảng hoặc quét chỉ mục. Nếu bạn muốn truy vấn hiệu quả hơn, bạn nên cố gắng viết lại truy vấn mà không sử dụng REGEXP nếu có thể:

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

Sau đó thêm chỉ mục trên (qkey, action). Nó không phải là dễ chịu để đọc, nhưng nó sẽ cho hiệu suất tốt hơn. Nếu bạn chỉ có một số lượng nhỏ các hành động cho mỗi qkey thì có lẽ nó sẽ không cung cấp bất kỳ sự gia tăng hiệu suất đáng chú ý nào để bạn có thể gắn bó với truy vấn đơn giản hơn.