Revista Informática

La sentencia CASE

Publicado el 11 junio 2014 por Jamesrevelo @herprogramacion
La sentencia CASE de SQL  es una estructura condicional que ejecuta ciertas instrucciones dependiendo de la validez de alguna expresión. Normalmente se usa cuando surgen múltiples condiciones donde se compare una expresión con una constante literal. Es una alternativa a la sentencia IF ya que ambas realizan el mismo cometido.
MySQL SQL Server CASE
En que momento sé que debo usar la sentencia CASE?Cuando deseas comparar una expresión con varios casos específicos, donde cada caso tomará un rumbo distinto. Seria como decir: "Se cumple el caso 1?, no?, entonces se cumple el caso 2?, no?,..., se cumple el enésimo caso?, no?. Si se cumple un caso, entonces se ejecutan las instrucciones dadas y termina el CASE.
Como implemento la sentencia CASE?Depende!, la sentencia CASE posee dos formas de ser escrita en SQL. La primer forma es un estilo "simple", donde el objetivo es comparar una expresión con una serie de constantes literales hasta que dicha expresión coincida en algún caso para poder ejecutar las sentencias. Veamos:

SQL Server MySQL

CASE <expresión_de_entrada>WHEN <valor1> THEN <resultado1>      WHEN <valor2> THEN <resultado2>...WHEN <valorN> THEN <resultadoN>ELSE <resultadoX>END CASE <expresión_de_entrada>WHEN <valor1> THEN intruccionesWHEN <valor2> THEN instrucciones...WHEN <valorN> THEN instruccionesELSEinstruccionesEND CASE;


La implementación de CASE en MySQL y SQL Server se diferencia en el contexto y naturaleza de su aplicación.
En que se diferencian?SQL Server restringe la aplicación de la estructura CASE a que se ejecute dentro de sentencias SELECT, UPDATE, SET, etc. Pero no es permitido ejecutar la estructura individualmente como hacíamos con IF...ELSE. Adicionalmente cada caso retorna un solo valor preestablecido.
En MySQL la sentencia CASE tiene alcances distintos. Este gestor permite que la estructura condicional se ejecute independientemente sin tener que apoyarse en otras sentencias. Además cada vez que se cumple una condición podemos ejecutar varias instrucciones y no solo devolver un valor como lo hace SQL Server.
Podrías usar un ejemplo para aclararlo? Por supuesto!, consideremos el siguiente enunciado:
Los clientes de una compañía tienen un atributo llamado prioridad, que hace referencia al volumen de compra total. Existen 3 niveles de prioridad: ALTO, MEDIO y BAJO. Donde cada uno es representado por su inicial 'A', 'M' y 'B' respectivamente. Muestre el nombre completo de cada prioridad según sea la letra que posea cada cliente.

Veamos la solución en MySQL y SQL Server:

SELECT CASE PRIORIDAD   WHEN 'A' THEN 'ALTO'   WHEN 'M' THEN 'MEDIO'     WHEN 'B' THEN 'BAJO'   ELSE 'NN'   ENDFROM CLIENTE CASE PRIORIDADWHEN 'A' THENSELECT 'ALTO';WHEN 'M' THENSELECT 'MEDIO';WHEN 'B' THENSELECT 'BAJO';ELSESELECT 'NN';END CASE;

SQL Server MySQL


Ambas instrucciones realización la misma acción, pero se diferencian en su contexto. En SQL Server debemos embeber el CASE dentro de una sentencia SELECT para poder usarlo. En cambio en MySQL podemos usarlo individualmente similar a lenguajes procedurales como C++ o Java.
Dices que hay otra forma de usar la sentencia CASE, cual es?Se le llama CASE de búsqueda. Su estructura cambia pero cumple exactamente las mismas funciones. Esta vez los condicionales no serán literales, si no expresiones condicionales formadas por operadores de comparación y operadores lógicos. Miremos un ejemplo:
Suponga que existe una variable llamada totalVentas, la cual contiene el total acumulado de todas las ventas hechas por un vendedor de su compañía en el mes actual. Si el vendedor obtuvo entre 1000 y 2000 dolares, asignele una comisión del 2% de las ventas a su salario. Si vendió entre 2001 y 3000 dolares, asignele una comisión del 3%  y si vendió mas de 3001 dolares, asignele una comisión del 7%.

Usaremos la sentencia CASE de búsqueda para representar esos 3 casos. Construiremos cada caso con el operador BETWEEN o algún operador de comparación.
SQL Server
UPDATE VENDEDORSET SALARIO =  CASE    WHEN @totalVentas BETWEEN 1000 AND 2000 THEN    SALARIO + @totalVentas * 0.02   WHEN @totalVentas BETWEEN 2001 AND 3000 THEN    SALARIO + @totalVentas * 0.03   WHEN @totalVentas >=3001 THEN    SALARIO +@totalVentas * 0.07                  END
MySQL
CASE   WHEN totalVentas BETWEEN 2000 AND 3000 THEN   UPDATE VENDEDOR   SET SALARIO = SALARIO + totalVentas * 0.02;   WHEN totalVentas BETWEEN 2001 AND 3000 THEN   UPDATE VENDEDOR   SET SALARIO = SALARIO + totalVentas * 0.03;   WHEN totalVentas>=3001 THEN   UPDATE VENDEDOR   SET SALARIO = SALARIO + totalVentas * 0.07;END CASE;
Como notas, ya no usamos una expresión de entrada luego de la palabra CASE, simplemente ubicamos cada condición compuesta después del WHEN y enseguida ubicamos lo que deseamos hacer en caso de cumplirse. 
Para SQL Server el CASE de búsqueda debe estar inmiscuido dentro de una sentencia, en este caso era la sentencia UPDATE. En cambio para MySQL, puede presentarse de forma individual, además de que podemos usar distintos tipos de  instrucción luego del THEN.
James Revelo Urrea - Desarrollador independiente

Volver a la Portada de Logo Paperblog