martes, 2 de septiembre de 2014

Receta T-SQL No. 1-16: Forzar el Orden con un Valor Arbitrario

Índice

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

Vamos a desarrollar esta receta T-SQL para comprender una técnica o modo de ordenamiento basado en un valor arbitrario a partir de un conjunto de casos. Para ejecutar esta tarea será necesario el uso de otra de las construcciones disponibles en Transact-SQL: CASE. Haremos una demostración con el ordenamiento de color de productos en donde se empiece por uno en particular y después el resto de colores en su orden natural (alfabético).

1. Problema

En las recetas anteriores hemos visto cómo establecemos el orden de los resultados de una consulta a partir de una columna (enumerada o no en la cláusula SELECT), ahora tenemos que encontrar un método de ordenamiento en donde podamos hacerlo a partir del valor de una columna con modificaciones arbitrarias sobre su representación.

2. Solución

El lenguaje T-SQL cuenta con la expresión CASE para especificar un orden de resultados basado en una expresión de entrada y unos casos de evaluación. Estos casos de evaluación corresponden con valores posibles del dominio de la expresión de entrada. Esto va a permitir establecer un valor de orden arbitrario.

3. Discusión de la Solución

Ya mencionamos que a través de la expresión CASE podemos indicar un valor de orden arbitrario. Esta expresión se describe sintácticamente así:
CASE input_expression
    WHEN when_expression THEN result_expression [ ...n ] 
    [ ELSE else_result_expression ] 

Descripción puntual:
  • input_expression: Expresión a evaluarse (e.g., una columna, una constante, una función escalar).
  • WHEN when_expression: Expresión que es comparada con input_expression.
  • THEN result_expression: Expresión retornada cuando input_expression es igual a la expresión del caso WHEN (when_expression).
  • ELSE else_result_expression (opcional): Si ninguno de los casos (WHEN) anteriores se cumple, el valor retornado coincide con el especificado en esta instrucción: else_result_expression.
Ahora escribamos una consulta en T-SQL para comprender su uso. Esta consulta consistirá en mostrar aquellos productos de color plateado (silver) y después los demás colores en orden alfabético ascendente.

SELECT p.ProductID,
p.Name,
p.Color
FROM Production.Product AS p
WHERE p.Color IS NOT NULL
ORDER BY CASE p.Color
WHEN 'Silver' THEN NULL
ELSE p.Color
END;

Notemos el uso de CASE: en primero lugar hemos especificado como expresión de entrada (input_expression) la columna Color de la tabla Product (p); a continuación, uno de los casos a evaluar -WHEN 'Silver'- comprueba su igualdad con la expresión de entrada, en caso de ser así, simplemente se muestra el valor del color actual; esto se logra mediante la especificación de NULL (aquí, como advierten en [1], los valores no existentes NULL se ordenan primero frente a cualquier otro valor de la columna Color). En caso contrario, es decir cuando el color no es plateado (Silver), se evalúa a p.Color: valor del color actual en esa columna.

Cuando ejecutemos esta consulta, obtendremos este resultado (parcial):
Uso de CASE para enlistar productos productos plateados primero
Figura 1. Uso de CASE para enumerar productos plateados primero.

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

Alteramos la consulta de la sección anterior también para considerar cualquier otra variación gráfica (mayúsculas y minúsculas) de la palabra 'Silver'. Esto lo logramos a través de la función LOWER. Con esta función hacemos que los valores de la columna Color se conviertan a minúsculas. Con esto garantizamos que todos los valores sean comparados con 'silver':

SELECT p.ProductID,
p.Name,
p.Color
FROM Production.Product AS p
WHERE p.Color IS NOT NULL
ORDER BY CASE LOWER(p.Color)
WHEN 'silver' THEN ' '
ELSE LOWER(p.Color)
END;

La expresión de entrada para CASE LOWER(p.Color) convierte los caracteres de cada valor de la columna Color a minúsculas. WHEN 'silver' se compara con la expresión de entrada, y en donde resulte verdadera la igualdad, entonces -THEN ' '- hace que se lleve a cabo el orden con el carácter de espacio, el cual tiene mayor prioridad en el orden que cualquier otro carácter perteneciente a los valores de la columna Color.

La ejecución de esta consulta generará el mismo resultado presentando en la Figura 1.

5. Conclusiones

Comprendimos un método de alternativo de ordenamiento de los resultados de una consulta a partir del uso de la expresión CASE. Con este método podemos especificar una lógica de ordenamiento más arbitraria que la simple exposición de columnas como lo hicimos en las recetas T-SQL inmediatamente anteriores. Para terminar esta primera serie de recetas T-SQL, en la siguiente y última, conoceremos cómo realizar la paginación de resultados.

6. Glosario

  • Cláusula
  • Expresión
  • Orden
  • Paginación
  • SQL Server
  • T-SQL

7. 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]: CASE (Transact-SQL) - http://msdn.microsoft.com/en-us/library/ms181765.aspx


S

No hay comentarios:

Publicar un comentario

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