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
IF
valida que la expresión de laSELECT
seaTRUE
oFALSE
. LaSELECT
devuelve unCOUNT
del número de registros de acuerdo al valor que le pasamos alWHERE
como parámetro. En este caso le estamos pasando la variable@identificador
que almacena el valor 8. Como dato importante recordar, que elidClientes
se 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 elidClientes
que hemos validado no existe en la tablaClientes
, por lo cual podemos proceder a realizar unINSERT INTO
del nuevo registro con los valores que hemos guardado en las variables. Antes de eso primero seteaIDENTITY_INSERT
a ON, para poder saltarnos la propiedad IDENTITY delidClientes
e insertar el valor que queremos, luego realiza elINSERT INTO
en la tabla, vuelve a setearIDENTITY_INSERT
a OFF y realiza unaSELECT
para visualizar el nuevo registro en la tablaClientes
. -
En el caso que el
IF
devuelvaFALSE
, es decir, que el@identificador
ya exista comoidClientes
en la tabla, nuestro código se ejecutara por elELSE
mostrando 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.