La función condicional IF
En la lección anterior vimos la expresión CASE para implementar lógica condicional en SQL. Sin embargo, no es el único mecanismo con el que puedes crear ramificaciones en una consulta. Ha llegado el momento de fijarnos en la función IF.
Sintaxis de IF
IF(condicion, valor_si_verdadero, valor_si_falso)- condicion
- La expresión lógica que se comprueba, por ejemplo price > 100.
- valor_si_verdadero
El valor que devuelve IF si la condición es verdadera.
- valor_si_falso
El valor que devuelve IF si la condición es falsa o NULL.
Funciones adicionales de lógica condicional
En la lección anterior estudiamos la expresión CASE para implementar lógica condicional en SQL. PostgreSQL ofrece funciones adicionales que simplifican el trabajo con la lógica condicional en casos especiales. Estas funciones son especialmente útiles para trabajar con valores NULL y escribir código más legible.
Funciones de lógica condicional
Además de la expresión universal CASE, PostgreSQL ofrece:
- Función COALESCE: para trabajar con valores NULL
- Función NULLIF: para casos especiales con NULL
Estas funciones forman parte del estándar SQL y hacen el código más legible en determinadas situaciones.
Ejemplos
-
Una comparación sencilla de dos números. Como 10 no es mayor que 20, la función devuelve 'FALSE'.
MySQL 8.4SELECT IF(10 > 20, 'TRUE', 'FALSE');
-
Un ejemplo sencillo de lógica condicional con la expresión CASE de la lección anterior:
MySQL 8.4SELECT CASE WHEN 10 > 20 THEN 'TRUE' ELSE 'FALSE' END;
-
Un ejemplo con una base de datos real. Hay que determinar, según el precio, a cuál de dos clases pertenece el alojamiento: «Clase confort» o «Clase económica». Si el precio es mayor o igual que 150, el alojamiento pertenece a la «Clase confort».
MySQL 8.4SELECT id, price, IF(price >= 150, 'Clase confort', 'Clase económica') AS category FROM Rooms
-
Un ejemplo con datos reales. La expresión CASE ayuda a clasificar los alojamientos por precio:
MySQL 8.4SELECT id, price, CASE WHEN price >= 150 THEN 'Clase confort' ELSE 'Clase económica' END AS category FROM Rooms
-
Las funciones IF también se pueden anidar unas dentro de otras, emulando la expresión CASE.
MySQL 8.4SELECT id, price, IF(price >= 200, 'Clase business', IF(price >= 150, 'Clase confort', 'Clase económica')) AS category FROM Rooms
-
CASE es ideal para varias condiciones:
MySQL 8.4SELECT id, price, CASE WHEN price >= 200 THEN 'Clase business' WHEN price >= 150 THEN 'Clase confort' ELSE 'Clase económica' END AS category FROM Rooms
Sin embargo, para casos especiales PostgreSQL ofrece funciones más especializadas.
Las funciones IFNULL y NULLIF
Además de la función IF, MySQL también tiene las funciones IFNULL y NULLIF, más sencillas pero menos universales, pensadas para tratar valores NULL.
Sintaxis de IFNULL
IFNULL(valor, valor_alternativo)- valor
El valor que se comprueba, por ejemplo una columna que puede contener NULL. Si no es NULL, la función lo devuelve.
- valor_alternativo
El valor que devuelve la función si valor es NULL.
La función COALESCE
La función COALESCE es una solución elegante para trabajar con valores NULL. Devuelve el primer valor no NULL de la lista de argumentos.
Sintaxis
COALESCE(valor [, ...])- [ ]parte opcional
- ...se puede repetir
- valor
Valores separados por comas, por ejemplo columnas de la tabla. Se comprueban de izquierda a derecha, y en último lugar puedes indicar un valor de reserva.
Es mucho más cómodo que escribir largas expresiones CASE para tratar los NULL.
Comparación de enfoques
Con CASE:
MySQL 8.4CASE WHEN valor1 IS NOT NULL THEN valor1 WHEN valor2 IS NOT NULL THEN valor2 ELSE valor3 END
Con COALESCE (mucho más sencillo):
MySQL 8.4COALESCE(valor1, valor2, valor3)
Ejemplos con la función IFNULL
-
Si el primer argumento no es NULL, se devuelve precisamente ese valor.
MySQL 8.4SELECT IFNULL('SQL Academy', 'Alternativa a SQL Academy') AS sql_trainer;
Ejemplos con la función COALESCE
-
Si el primer argumento no es NULL, se devuelve precisamente ese valor.
MySQL 8.4SELECT COALESCE('SQL Academy', 'Alternativa a SQL Academy') AS sql_trainer;
-
Si el primer argumento es NULL, se devuelve el valor pasado como segundo argumento.
MySQL 8.4SELECT IFNULL(NULL, 'Alternativa a SQL Academy') AS sql_trainer;
-
Si el primer argumento es NULL, se devuelve el siguiente valor que no sea NULL.
MySQL 8.4SELECT COALESCE(NULL, 'Alternativa a SQL Academy') AS sql_trainer; -
COALESCE puede recibir muchos argumentos, lo que hace el código muy legible:
MySQL 8.4SELECT COALESCE(NULL, NULL, 'SQL Academy', 'Opción de reserva') AS sql_trainer;
La función NULLIF
La función NULLIF resulta útil cuando necesitas sustituir un valor concreto por NULL. Puede servir para filtrar o para tratar valores «vacíos».
Sintaxis de NULLIF
NULLIF(valor_1, valor_2)- valor_1
- El valor que devuelve la función si no es igual a valor_2.
- valor_2
El valor de comparación. Si valor_1 es igual a él, la función devuelve NULL.
Ejemplos con la función NULLIF
-
Si el valor del primer argumento es igual al del segundo, se devuelve NULL.
MySQL 8.4SELECT NULLIF('SQL Academy', 'SQL Academy') AS sql_trainer;
-
Si el valor del primer argumento es igual al del segundo, se devuelve NULL.
MySQL 8.4SELECT NULLIF('SQL Academy', 'SQL Academy') AS sql_trainer;
-
Si los valores del primer y del segundo argumento son distintos, se devuelve el valor del primer argumento.
MySQL 8.4SELECT NULLIF('SQL Academy', 'Alternativa a SQL Academy') AS sql_trainer;
-
Si los valores del primer y del segundo argumento son distintos, se devuelve el valor del primer argumento.
MySQL 8.4SELECT NULLIF('SQL Academy', 'Alternativa a SQL Academy') AS sql_trainer;
Cuándo usar cada función:
- CASE: cuando necesitas una lógica condicional compleja con varias condiciones
- COALESCE: cuando necesitas sustituir valores NULL por valores por defecto
- NULLIF: cuando necesitas convertir determinados valores en NULL
Estas funciones hacen el código más legible y forman parte del estándar SQL.