2010-04-05 40 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只有少量动作,那么它可能不会带来任何明显的性能提升,因此您可以坚持使用更简单的查询。