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

MySQL 8.4
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:

  1. Función COALESCE: para trabajar con valores NULL
  2. 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.4
    SELECT IF(10 > 20, 'TRUE', 'FALSE');
    
    IF(10 > 20, "TRUE", "FALSE")
    FALSE
  • Un ejemplo sencillo de lógica condicional con la expresión CASE de la lección anterior:

    MySQL 8.4
    SELECT CASE WHEN 10 > 20 THEN 'TRUE' ELSE 'FALSE' END;
    
    case
    FALSE
  • 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.4
    SELECT id, price,
        IF(price >= 150, 'Clase confort', 'Clase económica') AS category
        FROM Rooms
    
    idpricecategory
    1149Clase económica
    2225Clase confort
    3150Clase confort
    489Clase económica
    580Clase económica
    6200Clase confort
    760Clase económica
    879Clase económica
    979Clase económica
    10150Clase confort
    11135Clase económica
    1285Clase económica
    1389Clase económica
    1485Clase económica
    15120Clase económica
    16140Clase económica
    17215Clase confort
    18140Clase económica
    1999Clase económica
    20190Clase confort
    21299Clase confort
    22130Clase económica
    2380Clase económica
    24110Clase económica
    25120Clase económica
    2660Clase económica
    2780Clase económica
    28150Clase confort
    2944Clase económica
    30180Clase confort
    3150Clase económica
    3252Clase económica
    3355Clase económica
    3450Clase económica
    3570Clase económica
    3689Clase económica
    3735Clase económica
    3885Clase económica
    39150Clase confort
    4040Clase económica
    4168Clase económica
    42120Clase económica
    43120Clase económica
    44135Clase económica
    45150Clase confort
    46150Clase confort
    47130Clase económica
    48110Clase económica
    49115Clase económica
    5080Clase económica
  • Un ejemplo con datos reales. La expresión CASE ayuda a clasificar los alojamientos por precio:

    MySQL 8.4
    SELECT id, price,
        CASE WHEN price >= 150 THEN 'Clase confort' ELSE 'Clase económica' END AS category
        FROM Rooms
    
    idpricecategory
    1149Clase económica
    2225Clase confort
    3150Clase confort
    489Clase económica
    580Clase económica
    6200Clase confort
    760Clase económica
    879Clase económica
    979Clase económica
    10150Clase confort
    11135Clase económica
    1285Clase económica
    1389Clase económica
    1485Clase económica
    15120Clase económica
    16140Clase económica
    17215Clase confort
    18140Clase económica
    1999Clase económica
    20190Clase confort
    21299Clase confort
    22130Clase económica
    2380Clase económica
    24110Clase económica
    25120Clase económica
    2660Clase económica
    2780Clase económica
    28150Clase confort
    2944Clase económica
    30180Clase confort
    3150Clase económica
    3252Clase económica
    3355Clase económica
    3450Clase económica
    3570Clase económica
    3689Clase económica
    3735Clase económica
    3885Clase económica
    39150Clase confort
    4040Clase económica
    4168Clase económica
    42120Clase económica
    43120Clase económica
    44135Clase económica
    45150Clase confort
    46150Clase confort
    47130Clase económica
    48110Clase económica
    49115Clase económica
    5080Clase económica
  • Las funciones IF también se pueden anidar unas dentro de otras, emulando la expresión CASE.

    MySQL 8.4
    SELECT id, price,
        IF(price >= 200, 'Clase business',
            IF(price >= 150,
                'Clase confort', 'Clase económica')) AS category
        FROM Rooms
    
    idpricecategory
    1149Clase económica
    2225Clase business
    3150Clase confort
    489Clase económica
    580Clase económica
    6200Clase business
    760Clase económica
    879Clase económica
    979Clase económica
    10150Clase confort
    11135Clase económica
    1285Clase económica
    1389Clase económica
    1485Clase económica
    15120Clase económica
    16140Clase económica
    17215Clase business
    18140Clase económica
    1999Clase económica
    20190Clase confort
    21299Clase business
    22130Clase económica
    2380Clase económica
    24110Clase económica
    25120Clase económica
    2660Clase económica
    2780Clase económica
    28150Clase confort
    2944Clase económica
    30180Clase confort
    3150Clase económica
    3252Clase económica
    3355Clase económica
    3450Clase económica
    3570Clase económica
    3689Clase económica
    3735Clase económica
    3885Clase económica
    39150Clase confort
    4040Clase económica
    4168Clase económica
    42120Clase económica
    43120Clase económica
    44135Clase económica
    45150Clase confort
    46150Clase confort
    47130Clase económica
    48110Clase económica
    49115Clase económica
    5080Clase económica
  • CASE es ideal para varias condiciones:

    MySQL 8.4
    SELECT id, price,
        CASE
            WHEN price >= 200 THEN 'Clase business'
            WHEN price >= 150 THEN 'Clase confort'
            ELSE 'Clase económica'
        END AS category
        FROM Rooms
    
    idpricecategory
    1149Clase económica
    2225Clase business
    3150Clase confort
    489Clase económica
    580Clase económica
    6200Clase business
    760Clase económica
    879Clase económica
    979Clase económica
    10150Clase confort
    11135Clase económica
    1285Clase económica
    1389Clase económica
    1485Clase económica
    15120Clase económica
    16140Clase económica
    17215Clase business
    18140Clase económica
    1999Clase económica
    20190Clase confort
    21299Clase business
    22130Clase económica
    2380Clase económica
    24110Clase económica
    25120Clase económica
    2660Clase económica
    2780Clase económica
    28150Clase confort
    2944Clase económica
    30180Clase confort
    3150Clase económica
    3252Clase económica
    3355Clase económica
    3450Clase económica
    3570Clase económica
    3689Clase económica
    3735Clase económica
    3885Clase económica
    39150Clase confort
    4040Clase económica
    4168Clase económica
    42120Clase económica
    43120Clase económica
    44135Clase económica
    45150Clase confort
    46150Clase confort
    47130Clase económica
    48110Clase económica
    49115Clase económica
    5080Clase económica

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

MySQL 8.4
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

MySQL 8.4
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.4
CASE
    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.4
COALESCE(valor1, valor2, valor3)

Ejemplos con la función IFNULL

  • Si el primer argumento no es NULL, se devuelve precisamente ese valor.

    MySQL 8.4
    SELECT IFNULL('SQL Academy', 'Alternativa a SQL Academy') AS sql_trainer;
    
    sql_trainer
    SQL Academy

Ejemplos con la función COALESCE

  • Si el primer argumento no es NULL, se devuelve precisamente ese valor.

    MySQL 8.4
    SELECT COALESCE('SQL Academy', 'Alternativa a SQL Academy') AS sql_trainer;
    
    sql_trainer
    SQL Academy
  • Si el primer argumento es NULL, se devuelve el valor pasado como segundo argumento.

    MySQL 8.4
    SELECT IFNULL(NULL, 'Alternativa a SQL Academy') AS sql_trainer;
    
    sql_trainer
    Alternativa a SQL Academy
  • Si el primer argumento es NULL, se devuelve el siguiente valor que no sea NULL.

    MySQL 8.4
    SELECT COALESCE(NULL, 'Alternativa a SQL Academy') AS sql_trainer;
    
    sql_trainer
    Alternativa a SQL Academy
  • COALESCE puede recibir muchos argumentos, lo que hace el código muy legible:

    MySQL 8.4
    SELECT COALESCE(NULL, NULL, 'SQL Academy', 'Opción de reserva') AS sql_trainer;
    
    sql_trainer
    SQL Academy

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

MySQL 8.4
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.4
    SELECT NULLIF('SQL Academy', 'SQL Academy') AS sql_trainer;
    
    sql_trainer
    <NULL>
  • Si el valor del primer argumento es igual al del segundo, se devuelve NULL.

    MySQL 8.4
    SELECT NULLIF('SQL Academy', 'SQL Academy') AS sql_trainer;
    
    sql_trainer
    <NULL>
  • Si los valores del primer y del segundo argumento son distintos, se devuelve el valor del primer argumento.

    MySQL 8.4
    SELECT NULLIF('SQL Academy', 'Alternativa a SQL Academy') AS sql_trainer;
    
    sql_trainer
    SQL Academy
  • Si los valores del primer y del segundo argumento son distintos, se devuelve el valor del primer argumento.

    MySQL 8.4
    SELECT NULLIF('SQL Academy', 'Alternativa a SQL Academy') AS sql_trainer;
    
    sql_trainer
    SQL Academy

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.