2010-04-05 15 views
14

मैं उन पंक्तियों को खोजने की कोशिश कर रहा हूं जहां पहला अक्षर अंक नहीं है। मैं इस है:MySQL नहीं Regexp की तरह नहीं?

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

लेकिन, मुझे यकीन है कि कैसे यकीन है कि यह सिर्फ पहली चरित्र की जाँच करता है बनाने के लिए नहीं कर रहा हूँ ...

उत्तर

11

आपकी वर्तमान regex मूल्यों ठीक एक अंकों से मिलकर की भरपाई कर देंगे, नहीं केवल पहला अक्षर। बस इसके अंत से $ हटाएं, जिसका अर्थ है "मूल्य का अंत"। यह केवल पहले वर्ण की जांच करेगा जबतक कि आप इसे और अधिक जांचने के लिए न कहें।

^[:digit:] काम करेगा, जिसका अर्थ है "मूल्य की शुरुआत, एक अंक के बाद"।

+0

इसके लिए धन्यवाद! – TwixxyKit

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, कार्रवाई) पर एक सूचकांक जोड़ें। यह पढ़ने के लिए सुखद नहीं है, लेकिन यह बेहतर प्रदर्शन देना चाहिए। यदि आपके पास प्रत्येक ककी के लिए केवल थोड़ी सी कार्रवाइयां हैं तो शायद यह कोई उल्लेखनीय प्रदर्शन वृद्धि नहीं देगी ताकि आप सरल क्वेरी के साथ रह सकें।