Bojan Petrovic

Consulta de datos utilizando la sentencia SQL Case

May 24, 2019 by

La sentencia case en el SQL se utiliza principalmente en un caso con expresiones de igualdad. La sentencia de SQL CASE generalmente está dentro de una lista de selección para alterar la salida. Lo que realiza es evaluar una lista de condiciones y devuelve una de las múltiples expresiones de resultado posibles.

Por ejemplo, vamos a ver cómo podemos hacer referencia a la base de datos “AdventureWorks2012” y poder mostrar un ejemplo de una declaración de SQL CASE.

Tomemos el campo “Género” (Gender) que es solo un campo de carácter. Entonces, si nos vamos a nuestra base de datos de muestra, tablas, dentro de la tabla de “Empleados” (Employee) hay una columna con el nombre de “Género” que es un tipo de datos nchar. Justo arriba de este se encuentra el “Estado Conyugal” (MaritalStatus), que también es un tipo de datos nchar, lo que significa que esos dos tienen un solo carácter:

Entonces, si queremos mostrar esto para cambiar la visualización del estado civil y las categorías de género para que sean más fáciles de comprender, tome en cuenta la siguiente consulta utilizando una sentencia de SQL CASE:

Esta es una sentencia de caso de gran expresión de igualdad en SQL. Lo que básicamente significa es que podemos hacer Case seguido del nombre del campo y luego podemos tener todas las expresiones de caso. En este caso particular, siempre que “Género” sea igual a “M”, entonces se emitirá como “Mujer” y cuando sea igual a “H”, se emitirá como “Hombre”. Además, si no es ninguno de los dos, aparecerá “Desconocido”. También, estamos asignando un alias al nombre de la columna como “Descripción de género”. Otra manera de hacer alias es poner primero el nombre del alias seguido de SQL CASE igual en “Estado de Conyugal” como se muestra en el ejemplo anterior.

Entonces, si ahora ejecutamos nuestra consulta con esta declaración de SQL CASE, buscará esa información y la emitirá adecuadamente:

No se puede ver en este ejemplo porque todos los campos coinciden con los argumentos, pero la sentencia case en el soporte SQL admite un argumento ELSE opcional. Esto quiere decir que también habrías visto la salida “Desconocida” si el carácter fuera diferente a lo indicado en la cláusula WHEN.

Ese es un tipo de uso de la sentencia SQL Case (versión de igualdad). También hay otra versión de expresión buscada que nos deja trabajar en un rango. La siguiente consulta se basa en el rango de precios de un producto:

Ahora, en lugar de realizar una sentencia de SQL CASE seguida de un nombre de columna, simplemente hacemos case, when, y luego el nombre de columna con el rango de salida y lo que queremos imprimir. La consulta anterior retornara el “Rango de precios” como un comentario de texto basado en el rango de precios de un producto:

Ahora, vamos a ver un par de ejemplos rápidos en los que también podemos usar una sentencia SQL Case porque varias veces y el lugar más común en el que vamos a ver una sentencia Case en SQL es en una lista de Selección para poder realizar cosas como las que hicimos arriba para modificar y trabajar con la salida. No obstante, muchas veces y en algunas cosas más avanzadas y complejas, como los procedimientos almacenados, verá la sentencia del SQL CASE en lugares como la cláusula Ordenar por y/o Dónde.

Ya que esto puede ser un poco fuera del ámbito o fuera del nivel de comodidad del tipo de consulta básica, también es bueno que nos familiaricemos con ellos porque es probable que algún día se encuentre con ellos y es aconsejable saber por qué allí y ver el poder de la sentencia de case en SQL.

Tenemos a continuación un ejemplo con la orden por. Pretendamos que queremos ordenar los resultados de nuestros productos. Ejecute una instrucción de selección rápida para poder recuperar todo de la tabla:

Notar que estamos interesados en la columna “MakeFlag”, que es un tipo de datos de bandera y contiene información si el producto se compra (0) o se fabrica en la empresa (1):

No obstante, digamos que queremos ordenar esta lista de resultados y mostrar los productos que se compraron primero y después los que se fabricaron internamente. Esto se hace fácilmente simplemente, solo agregando el case de SQL con “MakeFlag” cuando es 0, luego ordene por “ProductID” descendente:

Todo lo de arriba hasta la fila 265 se compra y el resto se fabrica internamente. Y así es como se usa la sentencia de SQL Case en una cláusula Ordenar por:

Tenemos otro ejemplo con la cláusula when. Es posible que esta no sea una buena declaración case en SQL porque la consulta a continuación no tiene ningún sentido, ¿verdad?

Es muy probable que estés pensando que podríamos decir simplemente Seleccionar todo de “Producto”, donde el “Precio de lista” es menos de 100. Sí, pero ten un poco paciencia conmigo. La cláusula when dice que 1 es igual a case cuando el precio es menor que 100, salida uno, de lo contrario 0 final. Lo que en realidad estamos haciendo aquí es que cuando 1 es igual a 1, retorna la fila y cuando 1 es igual a 0, no retorna la fila. En este caso particular, cuando el precio es menor que 100, retornará la fila y cuando sea mayor que 100 no devolverá nada.

Si realizamos una selección rápida de todo, tendremos 504 filas retornadas:

Si incluimos la cláusula Cuando con el SQL CASE está en ella, obtenemos 290 filas devueltas:

Probablemente esto todavía no parezca algo útil de inmediato, pero lo más probable es que se encuentre en una situación en la que deba tomar una decisión en la sentencia when. Entonces, la declaración del SQL CASE es un gran comienzo. Tenemos aquí hay una buena analogía. En las bases de datos, un problema común es qué valor utiliza para representar un valor faltante AKA, Valor nulo. Entonces aquí no podemos hacer ecualizaciones porque no podemos decir cosas como por ejemplo “donde un campo es igual a Nulo” ya que Nulo no es igual a 0. Este es realmente un ejemplo perfecto cuando se usa la sentencia case en SQL.

Deseo que este artículo sobre la sentencia case en SQL te haya sido útil y le agradezco que la haya leído.


Bojan Petrovic
T-SQL

Acerca de Bojan Petrovic

Bojan aka “Boksi”, an AP graduate in IT Technology focused on Networks and electronic technology from the Copenhagen School of Design and Technology, is a software analyst with experience in quality assurance, software support, product evangelism, and user engagement. He has written extensively on both the SQL Shack and the ApexSQL Solution Center, on topics ranging from client technologies like 4K resolution and theming, error handling to index strategies, and performance monitoring. Bojan works at ApexSQL in Nis, Serbia as an integral part of the team focusing on designing, developing, and testing the next generation of database tools including MySQL and SQL Server, and both stand-alone tools and integrations into Visual Studio, SSMS, and VSCode. View all posts by Bojan Petrovic

168 Views