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.
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…
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…
ResponderBorrarLastimosamente 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! :(
ResponderBorrarHola, 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...
BorrarSolo 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
BorrarMuy bien!!! me alegro q resuelvas, ahora tu solución es parte de mi base de conocimientos...estuve fuera 2 dias
Borrar