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.

¡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:
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.
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.
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.
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:
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.
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.
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: |
La palabra clave CASE va seguida de la instrucción WHEN, y no hay ninguna expresión entre CASE y WHEN.
P.ej: |
| 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: |
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: |
| Un caso simple solo admite una comprobación de igualdad, es decir, si CASE_Expression = VALUE_1, VALUE_2…
P.ej: |
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 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:
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:
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:
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:
Consultemos el 'GuruTabla '99' para comprobar los valores actualizados:
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:
¡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.













