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:

  1. En primer lugar declaramos y seteamos varias variables que se corresponden a los datos que almacena un registro de la tabla Clientes.

  2. El IF valida que la expresión de la SELECT sea TRUE o FALSE. La SELECT devuelve un COUNT del número de registros de acuerdo al valor que le pasamos al WHERE como parámetro. En este caso le estamos pasando la variable @identificador que almacena el valor 8. Como dato importante recordar, que el idClientes 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 la SELECT, esta solo podrá devolver 0 o 1.

  3. Si se cumple la condición del IF, es decir que nos devuelve 0 = 0 (TRUE), querrá indicar que el idClientes que hemos validado no existe en la tabla Clientes, por lo cual podemos proceder a realizar un INSERT INTO del nuevo registro con los valores que hemos guardado en las variables. Antes de eso primero setea IDENTITY_INSERT a ON, para poder saltarnos la propiedad IDENTITY del idClientes e insertar el valor que queremos, luego realiza el INSERT INTO en la tabla, vuelve a setear IDENTITY_INSERT a OFF y realiza una SELECT para visualizar el nuevo registro en la tabla Clientes.

  4. En el caso que el IF devuelva FALSE, es decir, que el @identificador ya exista como idClientes en la tabla, nuestro código se ejecutara por el ELSE 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.