Cómo buscar cadenas en varias columnas a la vez

Muchas veces necesitaremos buscar cadenas que podrian estar en muchas columnas. Esta tarea podriamos realizarlo individualmente, buscando la cadena en cada columna(una por una), o buscar a la vez en todas las columnas. Para ejemplificar un poco, vamos a crear la siguiente tabla:

CREATE TABLE dormitorios (
  [id] INT IDENTITY PRIMARY KEY,
[nombre] NVARCHAR(15),
[colorpiso] NVARCHAR(10),
[colortecho] NVARCHAR(10),
[colorpared] NVARCHAR(10))

Ahora, llenamos con data:

INSERT INTO dormitorios
SELECT 'Nhalim','YELLOW','BLUE','BLACK' UNION
SELECT 'Percy','BLACK','WHITE','BLUE' UNION
SELECT 'Saida','BLUE','GREEN','YELLOW' UNION
SELECT 'Yoshit','BLUE','PINK','BLACK'

Bien, ahora, ya teniendo todo listo, pasamos a buscar la cadena 'BLACK' en cada columna, una por una:

SELECT id,nombre
FROM dormitorios
WHERE [colorpiso] = 'BLACK'
OR [colortecho] = 'BLACK'
OR [colorpared] = 'BLACK'

Aquí algo más desastroso, pero que funciona:

SELECT id,nombre
FROM dormitorios
WHERE [colorpiso] LIKE '%BLACK%'
OR [colortecho] LIKE '%BLACK%'
OR [colorpared] LIKE '%BLACK%'

Finalmente te dejo una técnica de cómo buscar a la vez en todas las columnas en lugar de hacerlo individualmente.

SELECT id, nombre
FROM dormitorios
WHERE ':' + colorpiso + ':' + colortecho + ':' + colorpared + ':' LIKE '%:BLACK:%'

Lo que se ha hecho es concatenar y delimitar con dos puntos cada una de las columnas donde se desea buscar la cadena. Una manera bastante práctica e interesante de hacer el mismo trabajo. :).

Published 13/10/2007 2:15 por Percy Reyes
Comparte este post:
http://geeks.ms/blogs/ozonicco/archive/2007/10/13/c-243-mo-buscar-cadenas-en-varias-columnas-a-la-vez.aspx

Comentarios

# re: Cómo buscar cadenas en varias columnas a la vez

Buena idea :)

Saturday, October 13, 2007 10:03 AM por Dan

# re: Cómo buscar cadenas en varias columnas a la vez

Hola Percy,

La verdad que me ha sorprendido esta sintaxis, de hecho la he probado para acabar de creeerme que funcionaba :-) (es broma, está claro que estaba probada antes de publicarla).

He estado buscando en la ayuda de SQL Server 2005 y no encuentro ninguna referencia a ella. Me podrías indicar algun link donde se hable de esta sintaxis ?

Muchas gracias

Saturday, October 13, 2007 11:02 AM por Salvador Ramos

# re: Cómo buscar cadenas en varias columnas a la vez

Percy ... nice Tip :D

pero (te dejo un "pero" pequeño) esta técnica realiza una concatenacion de valores para luego evaluar los mismos por cada registro ... en otras palabras, nunca se evalua el valor de una tabla a traves del contenido de la misma, sino que se realiza un valor "virtual" con la concatenacion para cada registro y se evalua el LIKE sobre este ... puede ser un poco costoso si trabajas con tablas muy grandes.

Saludos

Saturday, October 13, 2007 12:21 PM por El Bruno

# re: Cómo buscar cadenas en varias columnas a la vez

Hola Bruno!,

Dándole la razón a sus comentarios, y suponiendo que si lo indexamos estas columnas las cosas mejorarían....

create index idx2 on Dormitorios([ColorPiso])

create index idx3 on Dormitorios([ColorTecho])

create index idx4 on Dormitorios([ColorPared])

He puesto en prueba esto, usando más de 880000 registros, e increiblemente he observado que costo de la operación ha aumentado. y el detalle es que la desventaja de este tipo de consulta es que el sistema de base de datos no tiene por qué ejecutar la consulta de manera eficiente. Es difícil para el sistema utilizar los índices cuando se utilizan cadenas concatenadas.

La recomendación es usar esta técnica sólo cuando se consulta poca data (hablo de cerca de 100 mil registros), caso contrario afectará la performance  :-).

Bruno!, Saludos cordiales, y gracias por la observación;

Percy Reyes.

Saturday, October 13, 2007 6:51 PM por Percy Reyes

# re: Cómo buscar cadenas en varias columnas a la vez

Hola Salavador Ramos!,

Pues te doy la razón, no existe en la documentación, y siento decirte que no tengo alguna referencia extra,  :).

Saludos cordiales!,

Percy Reyes,

Saturday, October 13, 2007 6:55 PM por Percy Reyes

# re: Cómo buscar cadenas en varias columnas a la vez

buenas!

Gracias por las tips! Solo un par de comentarios/dudas:

- en la ultima consulta (concatenando) no deberia ser...

WHERE  ':' + colorpiso + ':' + colortecho + ':' + colorpared + ':' LIKE ':%BLACK%:' ?

(si no, no esta buscando BLACK como subcadena, sino como la unica cadena del campo)

- y de nuevo en esa ultima consulta, pregunta para expertos de SQL: a primera vista yo supondria que los indices no cambiarian nada el comportamiento, no? En esta consulta se utiliza (como apunta ElBruno) un valor que no es de la tabla (con lo que el indice de la tabla no aplicaria) Es esto asi?

Sunday, October 14, 2007 10:13 AM por phobeo

# re: Cómo buscar cadenas en varias columnas a la vez

phobeo tiene razon, utilizando una concatenacion de columnas se aplica un filtro sobre un campo temporal/virtual, este campo al ser calculado no esta indexado ni mucho menos ... pero (otro pero, y este de los buenos) podemos encontrar un workaround si utilizamos calculated fields en SQL Server 2005 :D, estos se indexan como un campo mas

Saludos

Sunday, October 14, 2007 4:22 PM por El Bruno

# re: Cómo buscar cadenas en varias columnas a la vez

El problema lo tenemos en que estas búsquedas suelen llevar el like '%loquesea%' por lo que no es efectivo el uso de índices.

Sunday, October 14, 2007 4:52 PM por Salvador Ramos

# re: Cómo buscar cadenas en varias columnas a la vez

Hola Phobeo!,

Claro, te doy la razón, pero para este ejemplo, sabiendo que por cada columna sólo se tiene como data a una sóla palabra, he optado por usar '%:BLACK:%'  (para ser más específico). Ahora con ':%BLACK%:'  podemos hacer algo más general para buscar en campos donde sabemos que hay varias cadenas. Los dos puntos sólo es para evitar confusiones y separar los campos.

Bien, en cuanto al uso de índices, estos no llegan a usarse porque lo que al final se usa es el campo virtual que se calculó, :), pero si estorban, por lo que la consulta tiene mayor costo cuando se trabaje con un millón de datos por ejemplo.

Saludos cordiales!,

Sunday, October 14, 2007 5:06 PM por Percy Reyes

# re: Cómo buscar cadenas en varias columnas a la vez

hola kero ber como buscar cadenas por k no se

Sunday, July 20, 2008 11:10 PM por isidora