2011-08-27 19 views
6
SELECT * FROM dbname WHERE text = 'a%' 
(this can get all the `text` fields which begin with the letter "a".) 

¿Pero cómo obtener los campos donde aparece la primera letra! = [A-z]?php mysql consulta primera letra! = [A-z]

por ejemplo:

\"hello\" // this first letter begin as \ not range in a-z 
いけ // also first letter not begin range in a-z 
... 
may also have a white space as the first character. 

Entonces, ¿cómo se puede utilizar php mysql consulta para obtener todos estos tipos de resultados, donde la primera letra !=[a-z]?

Respuesta

8

Prueba esto:

SELECT * FROM dbname WHERE text REGEXP '^[^a-zA-Z]'; 

Eso es si quieres que sea sensible a mayúsculas (mayúsculas o minúsculas). Si desea permitir que las letras mayúsculas A-Z sólo tiene que utilizar:

SELECT * FROM dbname WHERE text REGEXP '^[^a-z]'; 

Esencialmente, la expresión regular dice que coincida con cualquier cadena que no tiene las letras a-z en el principio de la cadena.

1
SELECT * FROM dbname WHERE text NOT REGEXP '^[a-z]'; 
1

una solución no REGEXP es utilizar BETWEEN:

SELECT * FROM dbname WHERE LEFT(text, 1) NOT BETWEEN 'a' AND 'Z'; 

Esto debería ser más rápido que usar REGEXP, ya que MySQL puede utilizar índices de entre consultas , mientras que no puede en consultas REGEXP.

Sin embargo, no tengo puntos de referencia disponibles, aunque no debería ser difícil de probar.

+0

MySQL no usará el índice en el texto como lo ha envuelto en una función. Debe aislar el campo indexado en la comparación en la instrucción where para que mysql use un índice en él. – Riedsio

+0

@Riedsio, ¿a qué te refieres? 'LEFT' puede utilizar índices. – alexn

Cuestiones relacionadas