Ver Mensaje Individual
  #2 (permalink)  
Antiguo 24/07/2013, 11:01
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 11 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.