16

我正在尝试查找第一个字符不是数字的行。我有这个:

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

但是,我不确定如何确保它只检查第一个字符......

4

2 回答 2

26

首先,您的查询中有一个小错误。它应该是:

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, action) 上添加一个索引。阅读起来不那么愉快,但它应该提供更好的性能。如果您对每个 qkey 只有少量操作,那么它可能不会带来任何显着的性能提升,因此您可以坚持使用更简单的查询。

于 2010-04-05T16:43:32.827 回答
11

您当前的正则表达式将匹配仅由一个 digit组成的值,而不仅仅是第一个字符。只需$从它的末尾删除,这意味着“价值的终结”。它只会检查第一个字符,除非你告诉它检查更多。

^[:digit:]将起作用,这意味着“值的开始,后跟一位数字”。

于 2010-04-05T16:24:16.583 回答