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

Buscar con una expresión regular en un campo

Estas en el tema de Buscar con una expresión regular en un campo en el foro de Bases de Datos General en Foros del Web. Muy buenas. En una tabla tengo un campo de texto "OtrosTrabajadores" que puede tener varios números separados por comas. Código PHP: ID  |  NombreProyecto  |  ...
  #1 (permalink)  
Antiguo 22/06/2006, 06:26
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 22 años
Puntos: 4
Buscar con una expresión regular en un campo

Muy buenas. En una tabla tengo un campo de texto "OtrosTrabajadores" que puede tener varios números separados por comas.

Código PHP:
ID NombreProyecto Trabajador OtrosTrabajadores
-----------------------------------------------------
1  Proyeto 1      15         2,4,11
2  
Proyeto 2      8          2
3  
Proyeto 3      15         6,9,20 
Tengo que sacar con una consulta todos los proyectos en los que ha participado un determinado trabajador, bien como trabajador principal (campo "Trabajador") como colaborador (campo "OtrosTrabajadores").

SELECT NombreProyecto FROM Proyectos WHERE Trabajador = 2 OR OtrosTrabajadores LIKE '2'

En este ejemplo, me devuelve los tres proyectos porque en el campo "OtrosTrabajadores" coincide también el 20.

¿Cómo puedo hacer que busque el número completo?

Gracias
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!

Última edición por BrujoNic; 22/06/2006 a las 23:51
  #2 (permalink)  
Antiguo 22/06/2006, 10:59
Avatar de Linterns
Colaborador
 
Fecha de Ingreso: diciembre-2001
Mensajes: 2.799
Antigüedad: 22 años, 11 meses
Puntos: 11
SELECT NombreProyecto
FROM Proyectos
WHERE Trabajador = 2
OR OtrosTrabajadores LIKE '2,'
OR OtrosTrabajadores LIKE ',2,'
OR OtrosTrabajadores LIKE ',2'
__________________
Bien se puede recibir una puñalada sin adulación,
pero rara vez se recibe una adulación sin puñalada
** ***
  #3 (permalink)  
Antiguo 22/06/2006, 11:04
Avatar de PequeñoMauro  
Fecha de Ingreso: abril-2006
Ubicación: Lima - Perú
Mensajes: 600
Antigüedad: 18 años, 7 meses
Puntos: 3
Le agregaria el último
Cita:
SELECT NombreProyecto
FROM Proyectos
WHERE Trabajador = 2
OR OtrosTrabajadores LIKE '2,'
OR OtrosTrabajadores LIKE ',2,'
OR OtrosTrabajadores LIKE ',2'
OR OtrosTrabajadores='2'



solo habia tomado en cuenta 2
__________________
"Nada en mis manos traigo tan solo a tu cruz me aferro....."
  #4 (permalink)  
Antiguo 22/06/2006, 12:01
Avatar de Worp9975  
Fecha de Ingreso: mayo-2006
Ubicación: LV-426
Mensajes: 203
Antigüedad: 18 años, 5 meses
Puntos: 1
Qué base de datos es ? oracle, access, sqlserver, mysql ....

Si la base de datos es de microsoft puedes hacer la siguiente consulta:

Código:
 
SELECT NombreProyecto 
FROM Proyectos 
WHERE Trabajador = 2 
OR OtrosTrabajadores LIKE '*2*'
*cadena* : buscará cadena en cualquier posición (si empieza por cadena, si contiene cadena o si acaba en cadena)

Si la base de datos es Oracle :

Código:
 
SELECT NombreProyecto 
FROM Proyectos 
WHERE Trabajador = 2 
OR OtrosTrabajadores LIKE '%2%'
%cadena% : funciona igual que el * en microsoft

Salu2
__________________
Time is the fire in which we burn
  #5 (permalink)  
Antiguo 26/06/2006, 01:08
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 22 años
Puntos: 4
Gracias a todos por las respuestas. No he podido contestar antes porque el viernes estuvo caído FDW y no he tenido acceso el fin de semana. En fin, vamos a ver:

Si utilizo las consultas que me habéis indicado no obtendría buenos resultados ya que me devolvería como registro todos aquellos que, por ejemplo, tuvieran los siguientes valores:

...,20456,...
,1562,...
...,48926,...

Todas coinciden con las condiciones de búsqueda y sin embargo ninguna lleva al trabajador número 2.

La solución por tanto la he resuelto de la siguiente manera. Incluyo siempre al rellenar el campo con datos, comas al principio y al final, por ejemplo, ",34,56,123,". De esta manera el trabajador 2 siempre aparecerá "...,2,...". La consulta por tanto sería:

SELECT NombreProyecto FROM Proyectos WHERE Trabajador = 2 OR OtrosTrabajadores LIKE '%,2,%'

Un saludo y muchas gracias.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #6 (permalink)  
Antiguo 27/06/2006, 16:32
Avatar de goteen_mx  
Fecha de Ingreso: abril-2005
Ubicación: D.F.
Mensajes: 403
Antigüedad: 19 años, 7 meses
Puntos: 37
lo que debes hacer es que a tu campo le agregues un coma "," al inicio y al final de toda tu cadena y utilizas la funcion instr

trabajadores
,2,1,5,20,51,
,1,2,3,4,5,6,

asi al hacer tu consulta te quedaria asi

select * from proyectos where instr(trabajadores,',2,')<>0

asi te traeria unicamente los que tengan ,2, en la cadena

bye

Saludos
  #7 (permalink)  
Antiguo 27/06/2006, 16:34
Avatar de goteen_mx  
Fecha de Ingreso: abril-2005
Ubicación: D.F.
Mensajes: 403
Antigüedad: 19 años, 7 meses
Puntos: 37
lo siento es que deje el navegador abieto y despues vi la que ya estaba la respuesta

jejeje
  #8 (permalink)  
Antiguo 28/06/2006, 00:55
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 22 años
Puntos: 4
Gracias de todas formas, ya he aprendido una cosa nueva:

where instr(trabajadores,',2,')<>0

Un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
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 14:37.