2010-04-05 16 views
14

Estoy tratando de encontrar filas donde el primer caracter no es un dígito. Tengo esto:MySql No me gusta Regexp?

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

Pero, no estoy seguro de cómo asegurarse de que se comprueba sólo el primer carácter ...

Respuesta

11

Su expresión regular coincidirá con los valores actuales que consiste en exactamente un dígito, no el primer personaje solamente. Simplemente elimine el $ desde el final, que significa "fin del valor". Solo verificará el primer carácter a menos que le diga que verifique más.

^[:digit:] funcionará, eso significa "inicio del valor, seguido de un dígito".

+0

gracias por esto! – TwixxyKit

20

Primero hay un ligero error en su consulta. Debe ser:

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

Tenga en cuenta el doble paréntesis cuadrado. También podría volver a escribir como la siguiente para evitar también coincidente con la cadena vacía:

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

También tenga en cuenta que el uso de REGEXP impide un índice que se utilice y se traducirá en un recorrido de tabla o índice de exploración. Si desea una consulta más eficiente que debe tratar de reescribir la consulta sin utilizar REGEXP si es posible:

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

A continuación, agregue un índice en (QKey, acción). No es tan agradable de leer, pero debería ofrecer un mejor rendimiento. Si solo tiene un pequeño número de acciones para cada qkey, probablemente no le otorgue ningún aumento de rendimiento notable para que pueda seguir con la consulta más simple.