Sentencia condicional IF...ELSE en Transact SQL
IF…ELSE son estructuras de control de flujo para validar condiciones en las instrucciones de una o varias sentencias.
IF valida que, si la condición se cumple, la expresión booleana devuelve TRUE y se ejecutan las instrucciones que contenga. Si la condición no se cumple, la expresión booleana devuelve FALSE y no se ejecutan las mismas.
ELSE generalmente se utiliza después de las instrucciones del IF, y valida que se ejecuten las sentencias correspondientes en caso que las condiciones del IF devuelvan FALSE. Dicho de otro modo, si las condiciones del IF no se cumplen, se ejecutan las instrucciones del ELSE.
La sintáxis básica es la siguiente:
IF condition
Codigo a ejecutar si la condicion es true
ELSE
Codigo a ejecutar si la condicion es false
Para entender correctamente el funcionamiento de estas estructuras de control de flujo, vamos a ver dos ejemplos:
IF..ELSE:
DECLARE @a INT = 5;
DECLARE @b INT = 10;
IF @a < @b
SELECT @a
ELSE
SELECT @b
En este sencillo ejemplo, declaramos 2 variables numéricas y validamos si el valor de la primera @a es menor que la de la segunda @b. En este caso como la condición se cumple, se hará una consulta de @a. Si modificamos los valores y seteamos a @a un valor más elevado que @b, podemos comprobar que nuestro código ejecuta el ELSE y hará la consulta de @b.
BEGIN
DECLARE @identificador INT;
DECLARE @nombre NVARCHAR (50);
DECLARE @apellidos NVARCHAR (50);
SET @identificador = 8;
SET @nombre = 'María';
SET @apellidos = 'Navarro Benítez';
DECLARE @direccion NVARCHAR (100) = 'Av. de América 33' ;
Declare @cuenta FLOAT = 678555432;
IF (SELECT COUNT (1) clienteExistente
FROM clientes
WHERE idClientes = @identificador) = 0
BEGIN
SET IDENTITY_INSERT Clientes ON
INSERT INTO Clientes (idClientes,
nombre,
apellidos,
direccion,
cuenta)
VALUES (@identificador,
@nombre ,
@apellidos,
@direccion,
@cuenta)
SET IDENTITY_INSERT Clientes OFF
SELECT *
FROM Clientes
WHERE idClientes = @identificador
END
ELSE PRINT 'Ese identificador ya existe en la tabla Clientes'
END
En este ejemplo más real, estamos trabajando con nuestra tabla: Clientes. Para aquellos usuarios menos experimentados en el manejo de Transact SQL, procedemos a explicar paso a paso el funcionamiento del bloque de código:
-
En primer lugar declaramos y seteamos varias variables que se corresponden a los datos que almacena un registro de la tabla
Clientes. -
El
IFvalida que la expresión de laSELECTseaTRUEoFALSE. LaSELECTdevuelve unCOUNTdel número de registros de acuerdo al valor que le pasamos alWHEREcomo parámetro. En este caso le estamos pasando la variable@identificadorque almacena el valor 8. Como dato importante recordar, que elidClientesse corresponde a la Primary Key de la tabla, por lo que su valor no puede repetirse. Esto se traduce que según el valor que le pasemos a laSELECT, esta solo podrá devolver 0 o 1. -
Si se cumple la condición del
IF, es decir que nos devuelve 0 = 0 (TRUE), querrá indicar que elidClientesque hemos validado no existe en la tablaClientes, por lo cual podemos proceder a realizar unINSERT INTOdel nuevo registro con los valores que hemos guardado en las variables. Antes de eso primero seteaIDENTITY_INSERTa ON, para poder saltarnos la propiedad IDENTITY delidClientese insertar el valor que queremos, luego realiza elINSERT INTOen la tabla, vuelve a setearIDENTITY_INSERTa OFF y realiza unaSELECTpara visualizar el nuevo registro en la tablaClientes. -
En el caso que el
IFdevuelvaFALSE, es decir, que el@identificadorya exista comoidClientesen la tabla, nuestro código se ejecutara por elELSEmostrando un mensaje por consola que nos indique que ese identificador ya existe, por lo que no podemos insertar el registro.
IF anidados
Los IF anidados, son IF estándar que contienen dentro otros IF independientes, de manera que si se cumple la condición/es del primero, se validan las expresiones de los demás IF que contenga. Dentro de un bloque de código, pueden usarse IF anidados de manera indefinida y anidarse a distintos niveles, es decir, un if anidado dentro de un IF principal, puede a su vez contener otros IF anidados internamente y así sucesivamente.
DECLARE @a INT = 5
DECLARE @b INT = 10
DECLARE @c INT = 15
DECLARE @d INT = 20
IF @a <= @b
IF @d > @c AND @c > @b
IF @d = 20
SELECT 'EL RESULTADO ES VERDADERO' AS RESULTADO
ELSE
SELECT 'EL SEGUNDO IF ANIDADO ES FALSO' AS RESULTADO
ELSE
SELECT 'EL PRIMER IF ANIDADO ES FALSO' AS RESULTADO
ELSE
SELECT 'EL IF PRINCIPAL ES FALSO' AS RESULTADO
El siguiente ejemplo, vemos un IF que contiene un IF anidado y este a su vez contiene internamente otro IF anidado. Dependiendo del valor que otorguemos a las variables utilizadas, veremos si la ejecución finaliza correctamente o en su defecto, el nivel donde la expresión devuelve false ejecutándose el ELSE respectivo.
A menudo, los IF anidados son utilizados para simplificar la expresión de las condiciones de un IF, de manera que vayamos validando las distintas condiciones de manera repartida.