miércoles, 18 de septiembre de 2013

Buscar en varios campos de una tabla de una base de datos utilizando un único criterio de búsqueda


 Recientemente alguien pidió sugerencia de como buscar en varios campos de una tabla de una base de datos utilizando un único criterio de búsqueda, esto con independencia de los tipos de datos de los campos. El asunto era presentar a un usuario un campo de texto en un formulario o pagina web para realizar una búsqueda pero que la búsqueda se realizara en cualquier campo de la tabla de la base de datos.
Vamos a ilustrar el ejemplo. Supongamos que tenemos una tabla de estudiantes con datos hipotéticos.

Tabla Estudiantes
Campo
Tipo de dato
Nombre
String
Apellidos
String
Edad
Integer


Los datos de la tabla pudieran mostrarse más o menos así

Nombre
Apellidos
Edad
Juan
Pérez
21
José
Rodríguez
20
Enríquez
Martínez
22


El caso común para buscar en esta tabla seria encuestar al usuario de la aplicación sobre el criterio de búsqueda y luego formular una consulta SQL para realizar la búsqueda. En el caso que la busqueda se vaya a realizar por nombre la consulta quedaría asi:

Select * From estudiantes Where Nombre=”<criterio>”

Y asi para los restantes campos. Pero el caso que nos ocupa es que queremos implementar la búsqueda para que el usuario indique cualquier cosa como parámetro de búsqueda y esta se realice en cualquiera de los campos de la tabla
Mi sugerencia fue concatenar los campos (con su respectiva conversión a string en caso de que sea necesario) y utilizar el operador LIKE sobre esta concatenación.


Sería una construcción SQL más o menos así
Select * From estudiantes Where (Nombre +”-“ + Apellidos + “-“ + Edad) Like “%<criterio>%”
Por supuesto, necesitamos convertir a string el campo Edad y teniendo en cuenta que esta construcción SQL puede variar entre un gestor de base de datos y otro, veremos el caso en concreto.
SQL Server:
Select * from estudiantes Where (Nombre+'-'+Apellido+'-'+cast(Edad as char)) Like '%<criterio>%'
 
PostgreSQL:
Select * from estudiantes Where (Nombre ||'-' ||Apellido || '-' || cast(Edad as char)) Like %<criterio>%'
 
Como podemos apreciar para concatenar campos se usan diferentes caracteres entre un SGBD y otro…
Finalmente anotar que este tipo de consulta pudiera tornarse un poco lenta en dependencia de la cantidad de campos a buscar y de la cantidad de información almacenada en la tabla…







5 comentarios:

  1. Excelente Blog, todo lo que hay que hacer es seguir enriqueciendo, publicar artículos, ideas, etc., los desarrolladores de seguro que lo seguiremos… Felicitaciones por la idea…

    ResponderBorrar
  2. Lastimosamente a mi no me funciono, porque la cantidad de campos que estan en mi where son mas de 25 que concateno. Cuando solo lo hago por unos pocos campos si me funciona pero necesito hacerlo con una cantidad indefinida de campos! :(

    ResponderBorrar
    Respuestas
    1. Hola, gracias por escribir, la verdad es q nunca probe mas de 3 campos, tambien el articulo ya tiene algo de vejez, tuve q leer nuevamente para recordar, y veo q recomiendo no usar esa tecnica para muchos campos por lo lento q pudiera ser la busqueda, algo q se me ocurre es q tu SGBD tenga algun problema para procesar una sentencia SQL muy larga, si insistes en la idea te recomiendo probar ese mismo principio pero en un procedimiento almacenado q te de mas posibilidades programaticas...

      Borrar
    2. Solo por si a alguien le sirve! Al concatenar hay que revisar que no vayan valores nulos, yo uso el isnull(campo,0)+'-'+isnull(campo,0) para poder efectuarlo

      Borrar
    3. Muy bien!!! me alegro q resuelvas, ahora tu solución es parte de mi base de conocimientos...estuve fuera 2 dias

      Borrar