martes, 22 de julio de 2014

Receta T-SQL No. 1-11: Lista de Valores de Búsqueda

Tabla de Contenido

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
4. Práctica: Código T-SQL
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

Pasemos a esta siguiente receta de Transact-SQL para comprender el proceso de búsqueda basado en una lista de valores inclusivos. Con el nuevo conocimiento que adquiriremos en esta receta, entenderemos que a través del operador IN podemos omitir el uso de cadenas extensas compuestas por el operador OR. ¿Entonces? ¡Empecemos!

1. Problema

Debemos encontrar un método de especificación de lista de valores de búsqueda más intuitivo y fácil de mantener que el propio operador OR.

2. Solución

T-SQL cuenta con el operador IN que permite determinar si una expresión (i.e., constante, columna, variable, o función escalar) coincide con el valor retornado por una subconsulta o una lista de valores.

3. Discusión de la Solución

La sintaxis de uso del operador IN consiste en la siguiente generalización:

test_expression [ NOT ] IN 
    ( subquery | expression [ ,...n ]
    )

Descripción puntual:
  • Argumentos:
    • test_expression: consiste en cualquier expresión válida (i.e.constante, columna, variable, o función escalar).
    • subquery: subconsulta que retorna un conjunto de valores de una determinada columna. El tipo de retorno debe coincidir con test_expression.
    • expression [ ,...n ]: conjunto de valores de búsqueda.
  • Tipo de retorno:
    • Lógico (booleano).
  • Valor de retorno:
    • Si la expresión test_expression es igual a la expresión subquery o al conjunto de valores de la lista separada por comas (expression [ ,...n ]), el valor devuelto por la evaluación será TRUE; en caso contrario, FALSE.
En [2] nos hacen la siguiente advertencia:
Advertencia de uso de IN con valores NULL
Figura 1. Advertencia de uso de IN con valores NULL.
Versión texto:
«Any null values returned by subquery or expression that are compared to test_expression using IN or NOT IN return UNKNOWN. Using null values in together with IN or NOT IN can produce unexpected results.»
Veamos un ejemplo (tomado de Negación de la Condición de Búsqueda):

SELECT FirstName AS 'Nombre' , LastName AS 'Apellido'
FROM Person.Person
WHERE LastName NOT IN ('Sanchez', 'Duffy', 'Walter');

Notemos como hemos hecho uso del operador IN junto con el operador unario negación lógica NOT. Esto quiere decir que la consulta sólo retornará aquellos nombres y apellidos que no incluyan los siguientes apellidos:
  • Sanchez
  • Duffy, o
  • Walter
Resultado de ejecución:
Uso del operador IN con NOT
Figura 2. Uso del operador IN con NOT.

La consulta de previa es equivalente a esta, la cual utiliza el operador OR:

SELECT FirstName AS 'Nombre' , LastName AS 'Apellido'
FROM Person.Person
WHERE NOT (LastName = 'Sánchez' OR LastName = 'Duffy' OR LastName = 'Walter')

Resulta evidente que esta última expresión declarativa resulta más extensa debido al uso repetido múltiple y repetitivo del nombre de la columna (i.e.LastName) y el operador OR.

4. Práctica: Código T-SQL

Con el siguiente ejemplo de código T-SQL, enumeramos aquellos productos que incluyan cualquiera de estos colores (en inglés):
  • Silver
  • Black, o 
  • Red
SELECT ProductID AS 'ID Producto', Name AS 'Nombre', Color
FROM Production.Product
WHERE Color IN ('Silver', 'Black', 'Red');


Una vez ejecutada la consulta anterior obtenemos el siguiente resultado:
Uso del operador IN
Figura 3. Uso del operador IN. para la búsqueda de ciertos colores.

5. Conclusiones

Comprendimos que el uso del operador IN facilita la especificación de los valores de búsqueda sobre una expresión, y en particular es mucho más cómodo y accesible que recurrir a una cadena interminable de operadores OR.

6. Glosario

  • Consulta
  • Exclusivo
  • Inclusivo
  • Negación
  • Operador lógico
  • T-SQL

Literatura & Enlaces

[1]: SQL Server 2012 T-SQL Recipes - A Problem-Solucion Approach by Jason Brimhall, David Dye, Jonathan Gennick, Andy Roberts, and Wayne Sheffield. Copyright 2012 Jason Brimhall, David Dye, Jonathan Gennick, Andy Roberts, and Wayne Sheffield, 978-1-4302-4200-0.
[2]: IN (Transact-SQL) - http://msdn.microsoft.com/en-us/library/ms177682.aspx


S

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.