Monday, October 15, 2007

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. :).

Saludos cordiales!,

Hack: Usar "UNION" para minimizar el ancho de banda en "JOIN"s

Muchas veces al usarse JOINs traemos datos repetidos, y eso algunas veces es exagerado. Podemos usar UNION para minimizar el ancho de banda cuando se trabaje con uno o varios JOINs en una consulta. Para la demostración se usará las tablas Products y Categories de la histórica y muy conocida base de datos Northwind.

Bien, la siguiente consulta traerá las columnas (CategoryID, CategoryName, Description) de la tabla Categories y las columnas ProductID, ProductName y QuantityPerUnit de sus productos asociados. Para esto tenemos:

SELECT c.categoryid, c.categoryname, c.description,
p.productid, p.productname, p.quantityperunit
FROM products AS p
INNER JOIN categories c
ON p.categoryid = c.categoryid
WHERE c.categoryname = 'Seafood'
ORDER BY c.categoryid, p.productid

Los resultados podemos verlo así:



Vemos en los resultados que se repiten demasiados datos... ¿Qué hacer para mejorar la consulta?, una alternativa es transformar la consulta anterior usando UNION, en algo mucho mejor y razonable, para obtener esto:



La consulta debe ser así:



SELECT 'Categoria' AS tipofila,
c.categoryid, c.categoryname, c.description
FROM categories c
WHERE c.categoryname = 'Seafood'
UNION ALL
SELECT 'Productos' AS tipofila,
p.productid, p.productname, p.quantityperunit
FROM categories c
INNER JOIN products p
ON p.categoryid = c.categoryid
WHERE c.categoryname = 'Seafood'
ORDER BY tipofila

Aquí se está haciendo un uso óptimo del ancho de banda porque no hay datos repetidos para alguna columna de valores grandes, es más, la columnas "TipoFila" es opcional, pudiéndose optar por desecharlo, y entendiendo que la primera fila sería para los datos de la categoria.

Saludos Cordiales!,

Percy Reyes,

¿Cómo cifrar los Backups Files en SQL Server 2005?

Cada día se incrementa la necesidad de mantener segura toda la data de la base de datos, la cual puede implementarse usando diveros mecanismos de seguridad que nos trae SQL Server 2005. Por ejemplo, para encriptar (ya sé, es cifrar, no encriptar) cierta data como los números de tarjeta de crédito de nuestros clientes, en SQL Server 2005, podemos hacerlo mediante encriptación simétrica y/o asimétrica, certificados, etc, lo cual no podía realizarse en SQL Server 2000, a menos que se use ciertas herramientas de terceros como NetLib Encryptionizer, XP_CRYPT, o algún script.

Ahora, sabiendo que para la mayoría de nosotros, la seguridad de nuestra base de datos es lo último por la que nos preucupamos, y suponiendo que éste no es el caso, podríamos encriptar toda la data sensible para que no sea robada o no hacer vulnerable nuestro sistema de base de datos. En fin, con todo esto podríamos "encriptar" sólo cierta data que nosotros consideremos necesarias.

Leer articulo completo: ¿Cómo cifrar los Backups Files en SQL Server 2005?

Percy Reyes,



Tuesday, January 30, 2007

amor de un geek

¿Qué opinas de esta foto?, me hace recordar momentos especiales... ja.. ja...

Wednesday, January 24, 2007

Haber dime: ¿Qué piensas hacer con tu nuevo software?...

Bill Gates: No siempre tenemos a un genio por casa, haber dime muchacho (Geek, programador..etc), ¿Qué piensas hacer con tu nuevo software?...

Geek: pues..., mi amigo y yo estamos pensando en distribuirlo gratuitamente, regalarlo y sólo cobrar el apoyo técnico,

Bill Gates: a carambas!, mira... la realidad es que estamos en un negocio muy competitivo, en el negocio del software es sólo cuestión de tiempo antes de que alguien pida tu tecnología, la tome "prestada", la mejore, y gane millones de dólares con ella, y dices que piensas distribuirlo gratuitamente? :S.

Decidme ahora, ¿qué harías con mil millones de dólares?, ¿No lo sabes?, bueno.... podrías, por ejemplo, invertir ese dinero en tecnología, educación, arte... ¡transformar la cultura! , entiendes?...

Yo, a través de la fundación Gates, ayudo a los niños más pobres y a mucha gente a realizar todo su potencial, dono miles de ordenadores a todas las escuelas del pais, y a través del Programa de becas Gates Millennium (http://www.gmsp.org/) concedo becas a los estudiantes estadounidenses más cualificados con serias dificultades económicas.

uhmm, la pregunta es...

¿Cuánta gente con la que compartes tus conocimientos serán altruistas y cuántos amasarán fortunas gracias a tu generosidad?

Se dice que Microsoft copia programas y que fuerza a la gente a comprar versiones inferiores patentadas... y bla, bla, bla... en realidad, son comprensibles estos tipos de ataques, es la naturaleza del negocio: cuando estás arriba, todos atacan a la calidad del rival, es parte del negocio mientras no invada lo personal, como por ejemplo decir que Bill Gates es el demonio, estafador, hijo de pu..., basura, etc. Cualquier estrategia que adopta Microsoft, les parece mal, ...todo buen jugador de ajedrez se anticipa a la jugadas de su adversario... o no? todos en el negocio quieren ganar... Microsoft llegó primero, y es el chico malo!!!.... ¿por qué?

¿Cuál es delito de Microsoft?... acaso ¿trafiquicamos con armas químicas?, ¿Pornografía infantil?, ¿Colocamos minas?, ??? ..... Nooo!!!. El negocio del software es binario: o eres un uno o eres un cero o... vives o mueres. Microsoft seguirá siempre ayudándote a liberar tu potencial, tenéis que elegir, o ser olvidado o ser recordado como uno de los pocos ilustres que la historia reconocerá...