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 *