Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Buscar Nombres con REGEXP

Estas en el tema de Buscar Nombres con REGEXP en el foro de Mysql en Foros del Web. Buenas amigos estoy tratando de validar en MySQL una expresion regular qm permita buscar nombres la cuestion es que el nombre puede contener (al principio ...
  #1 (permalink)  
Antiguo 23/07/2013, 13:59
Avatar de JuJoGuAl  
Fecha de Ingreso: julio-2009
Ubicación: Venezuela
Mensajes: 754
Antigüedad: 14 años, 8 meses
Puntos: 19
Buscar Nombres con REGEXP

Buenas amigos estoy tratando de validar en MySQL una expresion regular qm permita buscar nombres la cuestion es que el nombre puede contener (al principio y fin) un espacio o no es decir:

Deseo buscar el nombre "JUAN" y este debe coincidir con:

-"JUAN"
-" JUAN"
-"JUAN "
-" JUAN "

Puesto que estoy buscando nombres en un campo que tiene Nombre y Apellido, pero no siempre estan en el orden NOMBRE APELLIDO (Es decir hay campos que estan APELLIDOS NOMBRE)

yo use esta expresion y pense que estaba bien:

Código MySQL:
Ver original
  1. SELECT * FROM indicadores.data_clientes WHERE clientes_den= 'V' AND clientes_sexo=0 AND clientes_nom REGEXP '[ ]?(ADA)[ ]?'

pero veo que me trae resultados como:
LOSADA,ADALISKY,ESTRADA.... (son nombres que tienen la palabra ADA)

y si uso esta:
Código MySQL:
Ver original
  1. SELECT * FROM indicadores.data_clientes WHERE clientes_den= 'V' AND clientes_sexo=0 AND clientes_nom REGEXP '^[ ]?(JESSE)[ ]?$'

no me muestra nombres que son:
-"JESSE JAIMS" y si contiene la palabra "JESSE" entonces me e super enredado tratando de solventar eso...

PD: no pongo el codigo de la CONSOLA porq nose como usarla estoy trabajando con el phpmyadmin que trae XAMPP
  #2 (permalink)  
Antiguo 24/07/2013, 11:01
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Buscar Nombres con REGEXP

Hola JuJoGuAl:

La construcción de expresiones regulares es un tema bastante amplio y se necesita de mucha práctica para poder llegar a dominarlas... sin embargo, algo que me ha servido para construir patrones de búsqueda es simplemente hacerlo por partes y utilizar condicionales... sé que no es la manera más óptima para hacerlo, pero funciona

Para el ejemplo, supongamos que tienes lo siguiente:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+---------------------+
  3. | id   | nombre              |
  4. +------+---------------------+
  5. |    1 | JUAN PEREZ INICIO   |
  6. |    2 | EN MEDIO JUAN PEREZ |
  7. |    3 | AL FINAL JUAN       |
  8. |    4 | JUAN                |
  9. |    5 | JUANITO             |
  10. |    6 | ALGO SANJUAN        |
  11. |    7 | SANJUANITO          |
  12. +------+---------------------+
  13. 7 rows in set (0.00 sec)

De acuerdo a lo que entendí con tu explicación, lo que quieres es buscar aquellos registros que contengan la palabra JUAN (independientemente de si está al inicio, en medio o al final), pero no aquellas donde la palabra JUAN forme parte de OTRA palabra (como JUANITO, SANJUAN, o SANJUANITO):

Lo que se me ocurrió es hacerlo por partes:

Código MySQL:
Ver original
  1. mysql> #Sólo contiene la palabra JUAN
  2. mysql> SELECT * FROM tabla WHERE nombre REGEXP '^JUAN$';
  3. +------+--------+
  4. | id   | nombre |
  5. +------+--------+
  6. |    4 | JUAN   |
  7. +------+--------+
  8. 1 row in set (0.39 sec)
  9.  
  10. mysql> #Sólo la palabra JUAN al inicio, pero pueden tener más palabras
  11. mysql> SELECT * FROM tabla WHERE nombre REGEXP '^JUAN[ ]';
  12. +------+-------------------+
  13. | id   | nombre            |
  14. +------+-------------------+
  15. |    1 | JUAN PEREZ INICIO |
  16. +------+-------------------+
  17. 1 row in set (0.00 sec)
  18.  
  19. mysql> #Contiene la palabra JUAN al FINAL (tiene un espacio antes)
  20. mysql> SELECT * FROM tabla WHERE nombre REGEXP '[ ]JUAN$';
  21. +------+---------------+
  22. | id   | nombre        |
  23. +------+---------------+
  24. |    3 | AL FINAL JUAN |
  25. +------+---------------+
  26. 1 row in set (0.00 sec)
  27.  
  28. mysql> #Contiene la palabra JUAN en medio, (hay espacio al inicio y al fin)
  29. mysql> SELECT * FROM tabla WHERE nombre REGEXP '[ ]JUAN[ ]';
  30. +------+---------------------+
  31. | id   | nombre              |
  32. +------+---------------------+
  33. |    2 | EN MEDIO JUAN PEREZ |
  34. +------+---------------------+
  35. 1 row in set (0.00 sec)


De tal manera, que tu Expresión regular la podrías construir utilizando el operador OR (|):

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla
  2.     -> WHERE nombre REGEXP '^JUAN$|^JUAN[ ]|[ ]JUAN$|[ ]JUAN[ ]';
  3. +------+---------------------+
  4. | id   | nombre              |
  5. +------+---------------------+
  6. |    1 | JUAN PEREZ INICIO   |
  7. |    2 | EN MEDIO JUAN PEREZ |
  8. |    3 | AL FINAL JUAN       |
  9. |    4 | JUAN                |
  10. +------+---------------------+
  11. 4 rows in set (0.00 sec)

Esta definitivamente no es la mejor manera de hacer una expresión regular, pero creo que te puede servir.

Dale un vistazo y nos comentas

Saludos
Leo.

Etiquetas: campo, nombres, php, regexp, select, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:43.