Declaración CASE y caso anidado en SQL Server: ejemplo de T-SQL

⚡ Resumen inteligente

CASE es una expresión condicional en SQL Server que devuelve un valor basado en la primera condición que se evalúa como verdadera, ofreciendo formas simples y con búsqueda, además de anidamiento dentro de IF…ELSE, UPDATE y ORDER BY.

  • 🧭 Valor condicional: Una expresión CASE devuelve un valor que depende de cuál de las condiciones WHEN se evalúe primero como verdadera.
  • 1️⃣ Caso simple: La instrucción CASE simple compara una expresión con una lista de valores y realiza una comprobación de igualdad para cada WHEN.
  • 🔎 CASO buscado: La función CASE con búsqueda evalúa una expresión booleana independiente para cada WHEN, y admite rangos y operadores de desigualdad.
  • ELSE es opcional: Cuando no hay coincidencias con WHEN y se omite ELSE, la expresión CASE devuelve NULL.
  • 🪆 Anidamiento: CASE puede anidarse dentro de otro CASE y dentro de una instrucción IF…ELSE para lógica multinivel.
  • 🔧 Más allá de SELECT: Además de SELECT, CASE funciona con las cláusulas UPDATE y ORDER BY para impulsar actualizaciones y ordenaciones condicionales.

Sentencia CASE y CASE anidado en SQL Server con ejemplos en T-SQL.

¡Descripción general del caso en la vida real!

De nuevo, en la vida real, realizamos diferentes acciones dependiendo del resultado de distintas condiciones. Para explicarlo mejor, consideremos el siguiente ejemplo:

  • Si los billetes de avión cuestan menos de 100 dólares, visitaré Los Ángeles.
  • Si los billetes de avión cuestan entre 100 y 200 dólares, entonces visitaré Nueva York.
  • Si los billetes de avión cuestan entre 200 y 400 dólares, entonces viajaré a Europa.
  • De lo contrario, prefiero visitar algún lugar turístico cercano.

Consideremos categorizar la condición y la acción por separado a partir del ejemplo anterior:

Condiciones – Billetes de avión Acciones realizadas solo si la condición es VERDADERA.
Less que $ 100 Visita los angeles
Entre $ 100 a $ 200 Visitar nueva york
Entre $ 200 a $ 400 Visitar europa
Ninguna de las condiciones anteriores se cumplió Punto turístico cercano

En el ejemplo anterior, podemos ver que el resultado de las diferentes condiciones rige una acción separada. Por ejemplo, el visitante realizará el acto de visitar Nueva York solo si el billete de avión está entre $100 y $200. De manera similar, el MS SQL La instrucción CASE también ofrece la capacidad de ejecutar diferentes instrucciones T-SQL en función del resultado de diferentes condiciones.

¿Qué es la declaración CASE en SQL Server?

Declaración de CASO en SQL Server es la extensión de la SI… DE LO CONTRARIO A diferencia de IF…ELSE, donde solo se permite una condición, CASE permite al usuario aplicar múltiples condiciones para realizar diferentes acciones en MS SQL. Devuelve un valor correspondiente asociado a la condición definida por el usuario.

Aprendamos cómo usar CASE en SQL y su concepto en las siguientes secciones. En MS SQL, existen dos tipos de CASE:

  • CASO sencillo
  • CASO buscado

CASO sencillo

La sintaxis para el caso simple

CASE <Case_Expression>
     WHEN Value_1 THEN Statement_1
     WHEN Value_2 THEN Statement_2
     .
     .
     WHEN Value_N THEN Statement_N
     [ELSE Statement_Else]   
END AS [ALIAS_NAME]

Aquí:

  • El parámetro Case_Expression indica la expresión que finalmente se comparará con Value_1, Value_2, y así sucesivamente.
  • Los parámetros Statement_1, Statement_2… indican las instrucciones que se ejecutarán si Case_Expression = Value_1, Case_Expression = Value_2, y así sucesivamente.
  • En resumen, la condición es si Case_Expression = Value_N, y la acción es la ejecución de Statement_N si el resultado anterior es VERDADERO.
  • ALIAS_NAME es opcional y es el nombre de alias que se le da al resultado de la instrucción CASE de SQL Server. Se usa principalmente cuando se utiliza CASE en la cláusula SELECT de SQL Server.

Reglas para casos simples

  • Simple Case solo permite una comprobación de igualdad de Case_Expression con Value_1 a Value_N.
  • La expresión Case_Expression se compara con un valor, en orden, comenzando por el primer valor, es decir, Value_1. A continuación se muestra el enfoque de ejecución:
  • Si Case_Expression es equivalente a Value_1, se omitirán más declaraciones WHEN...THEN y la ejecución CASE TERMINARÁ inmediatamente.
  • Si Case_Expression no coincide con Value_1, se compara con Value_2 para determinar su equivalencia. Este proceso de comparación continúa hasta que Case_Expression encuentra un valor equivalente entre Value_1, Value_2, y así sucesivamente.
  • Si no hay coincidencias, el control pasa a la instrucción ELSE y se ejecuta Statement_Else.
  • MÁS es opcional.
  • Si ELSE no está presente y Case_Expression no coincide con ninguno de los valores, entonces se muestra NULL.

El siguiente diagrama ilustra el flujo de ejecución de un caso simple:

Diagrama de flujo que muestra cómo un CASE simple evalúa cada valor WHEN en orden

Ejemplos

Supongamos que tenemos una tabla llamada 'Guru99' con dos columnas, Tutorial_ID y Tutorial_name, y cuatro filas, como se muestra a continuación. Usaremos este 'GuruTabla 99' en los ejemplos que siguen.

Muestra GuruTabla 99 con columnas Tutorial_ID y Tutorial_name y cuatro filas

Consulta 1: CASO SIMPLE con la opción NO MÁS

SELECT Tutorial_ID, Tutorial_name,
CASE Tutorial_name
	WHEN 'SQL' THEN 'SQL is developed by IBM'
	WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
END AS Description
FROM Guru99

Resultado: El diagrama a continuación explica el flujo de ejecución de un CASO SIMPLE sin ELSE.

Resultado de un CASE simple sin ELSE, mostrando un Descriptión para cada Tutorial_name

Consulta 2: CASO SIMPLE con la opción ELSE

SELECT Tutorial_ID, Tutorial_name,
CASE Tutorial_name
	WHEN 'SQL' THEN 'SQL is developed by IBM'
	WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
	ELSE 'This is NO SQL language.'
END AS Description
FROM Guru99

Resultado: El siguiente diagrama explica el flujo de ejecución de un CASO SIMPLE con ELSE.

Resultado de un CASE simple con ELSE, que devuelve el texto predeterminado para las filas no coincidentes.

CASO buscado

La sintaxis para el caso buscado

CASE 
     WHEN <Boolean_Expression_1> THEN Statement_1
     WHEN <Boolean_Expression_2> THEN Statement_2
     .
     .
     WHEN <Boolean_Expression_N> THEN Statement_N
     [ELSE Statement_Else]   
END AS [ALIAS_NAME]

Aquí:

  • El parámetro Boolean_Expression_1… indica la expresión que se evaluará como VERDADERA o FALSA.
  • Los parámetros Statement_1, Statement_2… indican las instrucciones que se ejecutarán si el resultado correspondiente de Boolean_Expression_1, Boolean_Expression_2 es ​​VERDADERO.
  • En resumen, la condición es Boolean_Expression_1… y la acción es la ejecución de Statement_N si la Boolean_Expression_1 anterior es VERDADERA.
  • ALIAS_NAME es opcional y es el nombre de alias que se le da al resultado de la instrucción CASE. Se usa principalmente cuando se utiliza CASE en la cláusula SELECT.

Reglas para el caso buscado

  • A diferencia del caso simple, el caso con búsqueda no se limita únicamente a una comprobación de igualdad, sino que permite una expresión booleana.
  • La expresión booleana se evalúa en orden, comenzando por la primera expresión booleana, es decir, Boolean_Expression_1. A continuación se muestra el método de ejecución:
  • Si Boolean_Expression_1 es VERDADERO, entonces se omiten las siguientes instrucciones WHEN…THEN y la ejecución de CASE TERMINARÁ inmediatamente.
  • Si Boolean_Expression_1 es FALSE, entonces Boolean_Expression_2 se evalúa para determinar si es VERDADERA. Este proceso de evaluación de las expresiones booleanas continúa hasta que una de ellas sea VERDADERA.
  • Si no hay coincidencias, el control pasa a la instrucción ELSE y se ejecuta Statement_Else.
  • Al igual que en el caso simple, ELSE también es opcional en el caso buscado.
  • Si ELSE no está presente y ninguna de las expresiones booleanas devuelve VERDADERO, entonces se muestra NULL.

El siguiente diagrama ilustra el flujo de ejecución del caso buscado:

Diagrama de flujo que muestra cómo un CASE buscado evalúa cada expresión booleana en orden

Ejemplos

Consulta 1: CASO BUSCADO con la opción NO MÁS

SELECT Tutorial_ID, Tutorial_name,
CASE 
 	WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM'
	WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
END AS Description
FROM Guru99

Resultado: El diagrama a continuación explica el flujo de ejecución del CASO BUSCADO sin ELSE.

Resultado de una búsqueda CASE sin ELSE, que hace coincidir cada Tutorial_name con un Description

Consulta 2: CASO BUSCADO con la opción ELSE

SELECT Tutorial_ID, Tutorial_name,
CASE 
	WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM'
	WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
	ELSE 'This is NO SQL language.'
END AS Description
FROM Guru99

Resultado: El siguiente diagrama explica el flujo de ejecución del CASO BUSCADO con ELSE.

Resultado de una búsqueda CASE con ELSE, que devuelve el texto predeterminado para lenguajes que no son SQL.

Diferencia entre el enfoque de ejecución: SIMPLE y CASO DE BÚSQUEDA

Veamos el siguiente ejemplo de CASO SIMPLE:

SELECT Tutorial_ID, Tutorial_name,
CASE Tutorial_name
	WHEN 'SQL' THEN 'SQL is developed by IBM'
	WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
	ELSE 'This is NO SQL language.'
END AS Description
FROM Guru99

Aquí, 'Tutorial_name' forma parte de la expresión CASE en SQL. A continuación, el valor de 'Tutorial_name' se compara con cada valor de WHEN, es decir, 'SQL'... hasta que 'Tutorial_name' coincida con un valor de WHEN.

Por el contrario, el ejemplo SEARCH CASE no tiene ninguna expresión CASE:

SELECT Tutorial_ID, Tutorial_name,
CASE 
 	WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM'
	WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
END AS Description
FROM Guru99

Aquí, cada instrucción WHEN tiene su propia expresión booleana condicional. Cada expresión booleana, por ejemplo, Tutorial_name = 'SQL'… se evalúa como VERDADERA/FALSA hasta que la primera expresión booleana se evalúa como VERDADERA.

Diferencia entre el caso simple y el caso buscado

Caso simple Caso buscado
La palabra clave CASE va seguida inmediatamente de la expresión CASE y precede a la instrucción WHEN.

P.ej:
CASE
CUANDO Valor_1 ENTONCES Declaración_1…

La palabra clave CASE va seguida de la instrucción WHEN, y no hay ninguna expresión entre CASE y WHEN.

P.ej:
CASO CUANDO ENTONCES Declaración_1…

En un caso simple, existe un VALOR para cada instrucción WHEN. Estos valores (Valor_1, Valor_2…) se comparan secuencialmente con una única expresión CASE. El resultado se evalúa para determinar si la condición es VERDADERA o FALSA para cada instrucción WHEN.

P.ej:
CASE
CUANDO Valor_1 ENTONCES Declaración_1…
CUANDO Valor_2 ENTONCES Declaración_2…

En un caso de búsqueda, existe una expresión booleana para cada instrucción WHEN. Estas expresiones booleanas (Expresión_Booleana_1, Expresión_Booleana_2…) evalúan la condición VERDADERA/FALSA para cada instrucción WHEN.

P.ej:
CASE
CUANDO ENTONCES Declaración_1…
CUANDO ENTONCES Declaración_2…

Un caso simple solo admite una comprobación de igualdad, es decir, si CASE_Expression = VALUE_1, VALUE_2…

P.ej:
CASO CUANDO Valor_1 ENTONCES Declaración_1…
En el ejemplo anterior, la única operación que realiza el sistema es comprobar si Case_Expression = Value_1.

Con Boolean_Expression_N, un caso buscado admite cualquier operación que dé como resultado un valor booleano. Esto incluye los operadores de igualdad y desigualdad.

P.ej:
CASO CUANDO ENTONCES Declaración_1…
En el ejemplo anterior, Boolean_Expression_1 puede contener tanto los operadores 'igual a' como 'distinto de', como A = B, A != B.

CASO anidado: CASO en SI ELSE

Podemos usar CASE dentro de una instrucción IF…ELSE. Declaramos una variable para el billete de avión y ramificar según su valor. A continuación se muestra un ejemplo de código MS-SQL:

DECLARE @Flight_Ticket int;
SET @Flight_Ticket = 190;
IF @Flight_Ticket > 400
   PRINT 'Visit Nearby Tourist Location';
ELSE 
BEGIN
    SELECT
	CASE 
	WHEN @Flight_Ticket BETWEEN 0 AND 100 THEN 'Visit Los Angeles'
	WHEN @Flight_Ticket BETWEEN 101 AND 200 THEN 'Visit New York'
	WHEN @Flight_Ticket BETWEEN 201 AND 400 THEN 'Visit Europe'
	END AS Location	
END

En el ejemplo anterior, la instrucción CASE está anidada dentro de la instrucción IF…ELSE. Primero, se ejecuta la instrucción IF, y si la condición CASE en SQL Server es falsa, se ejecuta la instrucción ELSE. La parte ELSE contiene una instrucción CASE anidada en SQL. Dependiendo del valor del billete de avión, se muestra uno de los siguientes resultados:

  • El sistema imprime "Visite un lugar turístico cercano" si los billetes de avión cuestan más de 400 dólares.
  • El sistema imprime "Visite Los Ángeles" si los billetes de avión cuestan ENTRE 0 Y 100 dólares.
  • El sistema imprime "Visite Nueva York" si los billetes de avión cuestan ENTRE 101 Y 200 DÓLARES.
  • El sistema imprime "Visite Europa" si los billetes de avión cuestan ENTRE 201 Y 400 DÓLARES.

El resultado que se muestra a continuación indica la ubicación devuelta cuando el CASE anidado se ejecuta dentro de la rama ELSE:

Resultado de un CASE anidado dentro de un IF…ELSE, imprimiendo la ubicación de la visita para el ticket.

CASO anidado: CASO dentro de CASO

En SQL, podemos usar una cláusula CASE dentro de otra cláusula CASE. A continuación se muestra un ejemplo de código MS-SQL:

DECLARE @Flight_Ticket int;
SET @Flight_Ticket = 250;
SELECT
CASE 
WHEN @Flight_Ticket >= 400 THEN 'Visit Nearby Tourist Location.'
WHEN @Flight_Ticket < 400 THEN 
    	CASE 
		WHEN @Flight_Ticket BETWEEN 0 AND 100 THEN 'Visit Los Angeles'
		WHEN @Flight_Ticket BETWEEN 101 AND 200 THEN 'Visit New York'
		WHEN @Flight_Ticket BETWEEN 201 AND 400 THEN 'Visit Europe'
		END	
END AS Location

En el ejemplo anterior, la instrucción CASE está anidada dentro de otra instrucción CASE. El sistema ejecuta primero la instrucción CASE externa; si Flight_Ticket < $400, se ejecuta la instrucción CASE interna. La ubicación devuelta sigue los mismos rangos de precios de boletos que en el ejemplo anterior, por lo que un boleto de $250 se encuentra dentro del rango de $201 a $400 y devuelve "Visitar Europa".

El resultado que se muestra a continuación indica la ubicación devuelta por el CASE interno para un boleto de $250:

Resultado de un CASO anidado dentro de otro CASO, que devuelve Visit Europe por un billete de 250

CASO con ACTUALIZACIÓN

Supongamos de nuevo que tenemos el 'GuruTabla de 99' con dos columnas y cuatro filas, como se muestra a continuación:

GuruTabla 99 antes de la ACTUALIZACIÓN DE CASO, que muestra los valores originales de Tutorial_Name.

Podemos usar CASE con ACTUALIZAR. A continuación se muestra el código MS-SQL de ejemplo:

UPDATE Guru99
SET Tutorial_Name = 
	(
	CASE
	WHEN Tutorial_Name = 'SQL' THEN 'Structured Query language.'
	WHEN Tutorial_Name = 'PL/SQL' THEN 'Oracle PL/SQL'
	WHEN Tutorial_Name = 'MSSQL' THEN 'Microsoft SQL.'
	WHEN Tutorial_Name = 'Hadoop' THEN 'Apache Hadoop.'
	END
	)

En el ejemplo anterior, se utiliza CASE en la instrucción UPDATE. Dependiendo del valor de Tutorial_Name, la columna Tutorial_Name se actualiza con el valor de la instrucción THEN:

  • Si Tutorial_Name = 'SQL', entonces actualice Tutorial_Name a 'Structured Query language'.
  • Si Tutorial_Name = 'PL/SQL', entonces actualice Tutorial_Name a 'Oracle PL/SQL.
  • Si Tutorial_Name = 'MSSQL', entonces actualice Tutorial_Name a 'Microsoft SQL.
  • Si Tutorial_Name = 'Hadoop', entonces actualice Tutorial_Name a 'Apache Hadoop'.

Al ejecutar la instrucción se actualizan las filas coincidentes, como se muestra a continuación:

Resultado de la ejecución de la instrucción CASE UPDATE en el GuruTabla 99

Consultemos el 'GuruTabla '99' para comprobar los valores actualizados:

GuruTabla 99 después de la ACTUALIZACIÓN DE CASO, mostrando los nuevos valores de Tutorial_Name

CASO con pedido por

Podemos usar CASE con ORDER BY. A continuación se muestra un ejemplo de código MS-SQL:

Declare @Order Int;
Set @Order = 1
Select * from Guru99 order by 
CASE 
	WHEN @Order = 1 THEN Tutorial_ID
	WHEN @Order = 2 THEN Tutorial_Name
	END
DESC

Aquí, se utiliza CASE con ORDER BY. @Order se establece en 1, y como la primera expresión booleana WHEN se evalúa como VERDADERA, se selecciona Tutorial_ID para la condición ORDER BY. El resultado se muestra a continuación:

Resultado de ORDER BY con una expresión CASE ordenando el GuruTabla 99 por Tutorial_ID

¡Datos interesantes!

  • CASE puede anidarse dentro de otro CASE, así como dentro de una instrucción IF…ELSE.
  • Además de SELECT, CASE se puede utilizar con otras cláusulas SQL como UPDATE y ORDER BY.

Preguntas Frecuentes

IIF() es una forma abreviada de una expresión CASE con dos resultados: devuelve un valor cuando la condición es verdadera y otro cuando es falsa. Una expresión CASE completa es más flexible y puede evaluar varias condiciones WHEN en una sola instrucción.

Sí. Dado que CASE devuelve un valor, puede aparecer en una lista SELECT, una cláusula WHERE, una cláusula HAVING y una cláusula GROUP BY. En una cláusula WHERE, CASE permite aplicar una lógica de filtrado diferente según los valores de otras columnas.

Sí. Colocar una expresión CASE dentro de SUM(), COUNT() o AVG() realiza una agregación condicional, sumando o contando solo las filas que coinciden con cada condición WHEN. Esta técnica se usa a menudo para crear informes de resumen tipo tabla dinámica.

Las funciones COALESCE e ISNULL solo devuelven el primer valor no nulo de una lista. Una expresión CASE es más amplia: evalúa condiciones booleanas arbitrarias o coincidencias de valores y devuelve el resultado de la primera rama que sea verdadera.

Una expresión CASE devuelve un único tipo de datos. SQL Server lo determina a partir de la precedencia de tipos de datos de cada resultado de THEN y ELSE, por lo que todas las ramas deben devolver tipos compatibles para evitar errores de conversión.

Sí. Una expresión CASE puede aparecer en la instrucción SELECT de una vista y en cualquier parte de un procedimiento almacenado, función o disparador. La misma sintaxis de expresión funciona en todos estos objetos.

Sí. Copiloto de GitHub Puede redactar expresiones CASE simples y con búsqueda, incluyendo CASE anidado y CASE dentro de UPDATE, a partir de una solicitud en lenguaje natural. Siempre revise las condiciones WHEN, el orden de las ramas y el manejo de ELSE antes de ejecutar la consulta.

Los asistentes de IA y aprendizaje automático traducen reglas en lenguaje natural a expresiones CASE simples o con búsqueda, sugieren ramas WHEN faltantes e indican superposiciones.ping o condiciones inalcanzables. El desarrollador revisa cada sugerencia para comprobar su corrección antes de implementarla.

Resumir este post con: