2010-04-25 14 views
26

¿Cuál es la mejor manera de ejecutar una consulta para que los espacios en los campos sean ignorados? Por ejemplo, las siguientes consultas:Pregunta que ignora los espacios

SELECT * FROM mytable WHERE username = "JohnBobJones"  
SELECT * FROM mytable WHERE username = "John Bob Jones" 

encontrarían las siguientes entradas:

John Bob Jones 
JohnBob Jones 
JohnBobJones 

estoy usando PHP o Python, pero creo que esto no importa.

+1

PostgreSQL o MySQL? La mejor solución puede ser diferente en cada caso. Intentar escribir algo que funcione en ambos suele ser una receta para una consulta lenta. –

Respuesta

54
SELECT * FROM mytable 
    WHERE REPLACE(username, ' ', '') = REPLACE("John Bob Jones", ' ', '') 
+0

funciona perfectamente en firebird2.5, también. – lordvlad

+0

También puede usar la función REPLACE() con operadores LIKE y comodines. Por ejemplo: SELECT * FROM mytable REPLACE (username, '', '') LIKE REPLACE ("John B%", '', ''); –

-1

Una forma sería usar LIKE y WildCards para crear su consulta. Algo como:

SELECCIONAR * FROM mytable DONDE nombre de usuario COMO 'John Bob Jones';

+15

Esto coincidirá incorrectamente con 'John Paul Bob Jones'. – SLaks

+0

Esta respuesta es incorrecta. –

10

Depende. Si no te preocupa el buen rendimiento, hay muchas cosas que puedes hacer, pero la mayoría serán lentas. Quizás esté bien para ti, pero dejaré esta respuesta aquí en caso de que otros lectores quieran una solución rápida.

Si desea un rendimiento muy rápido, debe indizar la cadena sin espacios en la base de datos. En PostgreSQL puede create an index on a function. Puede usar esto para crear un índice en la columna con espacios reemplazados por la cadena vacía. La ventaja de este método es que no requiere mantenimiento aparte de crear el índice.

En MySQL no puede hacer esto, así que la forma más simple sería duplicar los datos en la base de datos, una vez con espacios y otra sin ellos. Use la columna sin espacios en su cláusula WHERE, pero la columna original en su lista de columnas SELECCIONAR. Esto requiere más mantenimiento ya que las columnas deben mantenerse sincronizadas. Puede hacer esto con lógica de la aplicación o desencadenadores de base de datos.

+0

buen punto, acabo de probar mySQL REPLACE en una búsqueda de código postal y wow ... es lento ... ¡gracias por la sugerencia! – Ford

1

Prueba esto:

SELECT * FROM mytable WHERE username =REPLACE("John Bob Jones", ' ', '') 
+0

No encontraría 'JohnBob Jones' – Alan

2

La solución propuesta se ven muy bien pero es horrible para el rendimiento, si es posible restringir la consulta con algo como

SELECT * FROM mitabla WHERE nombre de usuario como 'John % 'y REPLACE (username,' ',' ') = REPLACE ("John Bob Jones",' ',' ')

También puede usar REGEXP.

SELECT * FROM mitabla WHERE nombre de usuario REGEXP '^ John * * Bob Jones

Y recuerda el rendimiento, el funcionamiento en el dónde están en mala idea general.

echar un vistazo para http://dev.mysql.com/doc/refman/5.7/en/pattern-matching.html

0

menudo Queremos buscar un texto, sin importar el número de espacios, espacios en blanco y las letras.

Recorte, minúsculas y reemplace todos los caracteres sin palabras de una palabra por un espacio.

SELECT regexp_replace(trim(lower('Here is    a   long    text    , with   many     white spaces   AND    different     character    sensitive')),'\W+',' ','g') t 

retorno: aquí es un texto largo con muchos espacios en blanco y caracteres diferente sensibles

Aquí es el uso para la búsqueda. Solo el orden de las palabras es importante, nada más. Y esto es hermoso.

select * from (
SELECT regexp_replace(trim(lower('Here is    a   long    text    , with   many     white spaces   AND    different     character    sensitive')),'\W+',' ','g') t 
) as o 
where t= regexp_replace(trim(lower('Here is a LonG  TEXT , with   mANY white ^ spaces   AND   different character    sensiTive')),'\W+',' ','g') 

retorno: aquí es un texto largo con muchos espacios en blanco y caracteres diferente sensibles

de Basuras de los datos y de la chatarra en la consulta, pero todavía se encuentra bien.

Cuestiones relacionadas