Buscar un registro en cualquier columna de una tabla con SQL
Tan importante como saber de código, es saber de querys y bases de datos para un desarrollador que se diga senior 😉👌

Seguramente en más de una ocasión te haz encontrado en la situación de querer saber si una palabra, frase o mejor dicho un registro cualquiera existe en una tabla, pero no sabes en qué columna buscar, ya que si supieses la columna bastaría con que hagas una sentencia SELECT, sin embargo hay situaciones en las que quieres asegurarte de la existencia de dicho registro en más de una columna o mejor aún, en todas las columnas de una tabla.

Esta situación es justamente la que aquí vamos a abordar y dar solución, este artículo será de T-SQL.

Si no sabes de bases de datos te recomiendo que empieces con mi artículo Lo que un desarrollador debe saber sobre bases de datos.

Vamos al script en T-SQL, y es el siguiente:

DECLARE @table VARCHAR(50);
DECLARE @stringToFind VARCHAR(100)
SET @table = 'tu_tabla'
SET @stringToFind = 'tu_cadena_a_buscar'

BEGIN TRY
   DECLARE @sqlCommand varchar(max) = 'SELECT * FROM [' + @table + '] WHERE ' 
	   
   SELECT @sqlCommand = @sqlCommand + '[' + COLUMN_NAME + '] LIKE ''' + @stringToFind + ''' OR '
   FROM INFORMATION_SCHEMA.COLUMNS 
   WHERE TABLE_NAME = @table
   AND DATA_TYPE IN ('char','nchar','ntext','nvarchar','text','varchar','int','decimal')

   SET @sqlCommand = left(@sqlCommand,len(@sqlCommand)-3)
   EXEC (@sqlCommand)
   PRINT @sqlCommand
END TRY

BEGIN CATCH 
   PRINT 'There was an error. Check to make sure object exists.'
   PRINT error_message()
END CATCH 

En las líneas 3 y 4 es donde pones tu tabla y tu cadena a buscar, ojo que en la cadena a buscar puedes incluir % para insertar comodines de búsqueda y no tener la necesidad de tener que poner el texto completo y exacto.

Ejemplo práctico

Tengo una base de datos con una tabla llamada PRODUCTO y tiene 262 registros:

Quiero buscar a todos los productos CRUSH pero que no sólo busque en la columna descripción ya que puede ser que la descripción no incluya la marca, quiero que busque a los productos CRUSH en todas las columnas y me los traiga, entonces adapto mi query y ejecuto:

DECLARE @table VARCHAR(50);
DECLARE @stringToFind VARCHAR(100)
SET @table = 'producto'
SET @stringToFind = 'crush%'

BEGIN TRY
   DECLARE @sqlCommand varchar(max) = 'SELECT * FROM [' + @table + '] WHERE ' 
	   
   SELECT @sqlCommand = @sqlCommand + '[' + COLUMN_NAME + '] LIKE ''' + @stringToFind + ''' OR '
   FROM INFORMATION_SCHEMA.COLUMNS 
   WHERE TABLE_NAME = @table
   AND DATA_TYPE IN ('char','nchar','ntext','nvarchar','text','varchar','int','decimal')

   SET @sqlCommand = left(@sqlCommand,len(@sqlCommand)-3)
   EXEC (@sqlCommand)
   PRINT @sqlCommand
END TRY

BEGIN CATCH 
   PRINT 'There was an error. Check to make sure object exists.'
   PRINT error_message()
END CATCH 

Obtengo lo siguiente:

Nota cómo en este caso buscando en todas las columnas traemos también aquellos registros que tienen un nombre incompleto o un error de tipeo como es el caso de los registros 6 y 7 de la imagen.

Y así es como pasamos de 262 a 7 registros, un número sin duda muchísimo más manejable.

Ahora que lo sabes, ponlo en práctica 😉 Foto de Csaba Balazs en Unsplash

Alguien podría decir, sí pero eso pude haberlo hecho haciendo una selección a toda la tabla, pasándola a excel y luego filtrando o buscando, y es cierto puedes hacerlo pero son muchos pasos y de lo que se trata es de mejorar y además automatizar tareas como ésta, y hacerlo mejor y más rápido, no lo olvides 😉 si ya existe la técnica de hacerlo bien, pues utilízala!.

Eso fue todo por ahora, espero te haya servido este post crack! 🎉

Más adelante seguiremos con este tipo de querys que nos facilitan un montón la vida a los desarrolladores y tambien a quienes administran bases de datos, en especial SQL Server.

Si esta entrada te ha gustado no dudes en compartirla crack! 💪😊

2 comentarios en «Buscar un registro en cualquier columna de una tabla con SQL»

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *