Условная функция IF

В предыдущем уроке мы рассматривали оператор CASE для реализации условной логики в SQL. Однако это не единственный механизм, с помощью которого возможно реализовать ветвление логики в запросе. Пришло время обратить наше внимание на функцию IF.

Синтаксис IF

MySQL 8.1
IF(условное_выражение, значение_1, значение_2);

Если условное выражение, передаваемое в качестве первого аргумента в функцию IF, истинно, функция вернёт значение второго аргумента значение_1, иначе возвращается значение третьего аргумента значение_2.

Дополнительные функции условной логики

В предыдущем уроке мы изучили оператор CASE для реализации условной логики в SQL. PostgreSQL предоставляет дополнительные функции, которые упрощают работу с условной логикой в специальных случаях. Эти функции особенно полезны при работе с NULL значениями и создании более читаемого кода.

Функции для условной логики

Помимо универсального оператора CASE, PostgreSQL предоставляет:

  1. Функция COALESCE - для работы с NULL значениями
  2. Функция NULLIF - для специальных случаев с NULL

Эти функции являются стандартными SQL функциями и делают код более читаемым в определенных ситуациях.

Примеры

  • Простое сравнение двух чисел. Так как 10 не больше 20, функция вернёт 'FALSE'.

    MySQL 8.1
    SELECT IF(10 > 20, 'TRUE', 'FALSE');
    
    IF(10 > 20, "TRUE", "FALSE")
    FALSE
  • Простой пример условной логики с помощью оператора CASE из предыдущего урока:

    MySQL 8.1
    SELECT CASE WHEN 10 > 20 THEN 'TRUE' ELSE 'FALSE' END;
    
    case
    FALSE
  • Пример использования с реальной БД. Необходимо на основании цены определить принадлежность жилья к одному из двух классов: "Комфорт-класс" и "Эконом-класс". Если цена больше или равна 150, то это жильё относится к "Комфорт-класс".

    MySQL 8.1
    SELECT id, price,
        IF(price >= 150, 'Комфорт-класс', 'Эконом-класс') AS category
        FROM Rooms
    
    idpricecategory
    1149Эконом-класс
    2225Комфорт-класс
    3150Комфорт-класс
    489Эконом-класс
    580Эконом-класс
    6200Комфорт-класс
    760Эконом-класс
    879Эконом-класс
    979Эконом-класс
    10150Комфорт-класс
    11135Эконом-класс
    1285Эконом-класс
    1389Эконом-класс
    1485Эконом-класс
    15120Эконом-класс
    16140Эконом-класс
    17215Комфорт-класс
    18140Эконом-класс
    1999Эконом-класс
    20190Комфорт-класс
    21299Комфорт-класс
    22130Эконом-класс
    2380Эконом-класс
    24110Эконом-класс
    25120Эконом-класс
    2660Эконом-класс
    2780Эконом-класс
    28150Комфорт-класс
    2944Эконом-класс
    30180Комфорт-класс
    3150Эконом-класс
    3252Эконом-класс
    3355Эконом-класс
    3450Эконом-класс
    3570Эконом-класс
    3689Эконом-класс
    3735Эконом-класс
    3885Эконом-класс
    39150Комфорт-класс
    4040Эконом-класс
    4168Эконом-класс
    42120Эконом-класс
    43120Эконом-класс
    44135Эконом-класс
    45150Комфорт-класс
    46150Комфорт-класс
    47130Эконом-класс
    48110Эконом-класс
    49115Эконом-класс
    5080Эконом-класс
  • Пример с реальными данными. Оператор CASE помогает категоризировать жильё по цене:

    MySQL 8.1
    SELECT id, price,
        CASE WHEN price >= 150 THEN 'Комфорт-класс' ELSE 'Эконом-класс' END AS category
        FROM Rooms
    
    idpricecategory
    1149Эконом-класс
    2225Комфорт-класс
    3150Комфорт-класс
    489Эконом-класс
    580Эконом-класс
    6200Комфорт-класс
    760Эконом-класс
    879Эконом-класс
    979Эконом-класс
    10150Комфорт-класс
    11135Эконом-класс
    1285Эконом-класс
    1389Эконом-класс
    1485Эконом-класс
    15120Эконом-класс
    16140Эконом-класс
    17215Комфорт-класс
    18140Эконом-класс
    1999Эконом-класс
    20190Комфорт-класс
    21299Комфорт-класс
    22130Эконом-класс
    2380Эконом-класс
    24110Эконом-класс
    25120Эконом-класс
    2660Эконом-класс
    2780Эконом-класс
    28150Комфорт-класс
    2944Эконом-класс
    30180Комфорт-класс
    3150Эконом-класс
    3252Эконом-класс
    3355Эконом-класс
    3450Эконом-класс
    3570Эконом-класс
    3689Эконом-класс
    3735Эконом-класс
    3885Эконом-класс
    39150Комфорт-класс
    4040Эконом-класс
    4168Эконом-класс
    42120Эконом-класс
    43120Эконом-класс
    44135Эконом-класс
    45150Комфорт-класс
    46150Комфорт-класс
    47130Эконом-класс
    48110Эконом-класс
    49115Эконом-класс
    5080Эконом-класс
  • Функции IF можно также вкладывать друг в друга, эмулируя оператор CASE.

    MySQL 8.1
    SELECT id, price,
        IF(price >= 200, 'Бизнес-класс',
            IF(price >= 150,
                'Комфорт-класс', 'Эконом-класс')) AS category
        FROM Rooms
    
    idpricecategory
    1149Эконом-класс
    2225Бизнес-класс
    3150Комфорт-класс
    489Эконом-класс
    580Эконом-класс
    6200Бизнес-класс
    760Эконом-класс
    879Эконом-класс
    979Эконом-класс
    10150Комфорт-класс
    11135Эконом-класс
    1285Эконом-класс
    1389Эконом-класс
    1485Эконом-класс
    15120Эконом-класс
    16140Эконом-класс
    17215Бизнес-класс
    18140Эконом-класс
    1999Эконом-класс
    20190Комфорт-класс
    21299Бизнес-класс
    22130Эконом-класс
    2380Эконом-класс
    24110Эконом-класс
    25120Эконом-класс
    2660Эконом-класс
    2780Эконом-класс
    28150Комфорт-класс
    2944Эконом-класс
    30180Комфорт-класс
    3150Эконом-класс
    3252Эконом-класс
    3355Эконом-класс
    3450Эконом-класс
    3570Эконом-класс
    3689Эконом-класс
    3735Эконом-класс
    3885Эконом-класс
    39150Комфорт-класс
    4040Эконом-класс
    4168Эконом-класс
    42120Эконом-класс
    43120Эконом-класс
    44135Эконом-класс
    45150Комфорт-класс
    46150Комфорт-класс
    47130Эконом-класс
    48110Эконом-класс
    49115Эконом-класс
    5080Эконом-класс
  • CASE отлично подходит для множественных условий:

    MySQL 8.1
    SELECT id, price,
        CASE
            WHEN price >= 200 THEN 'Бизнес-класс'
            WHEN price >= 150 THEN 'Комфорт-класс'
            ELSE 'Эконом-класс'
        END AS category
        FROM Rooms
    
    idpricecategory
    1149Эконом-класс
    2225Бизнес-класс
    3150Комфорт-класс
    489Эконом-класс
    580Эконом-класс
    6200Бизнес-класс
    760Эконом-класс
    879Эконом-класс
    979Эконом-класс
    10150Комфорт-класс
    11135Эконом-класс
    1285Эконом-класс
    1389Эконом-класс
    1485Эконом-класс
    15120Эконом-класс
    16140Эконом-класс
    17215Бизнес-класс
    18140Эконом-класс
    1999Эконом-класс
    20190Комфорт-класс
    21299Бизнес-класс
    22130Эконом-класс
    2380Эконом-класс
    24110Эконом-класс
    25120Эконом-класс
    2660Эконом-класс
    2780Эконом-класс
    28150Комфорт-класс
    2944Эконом-класс
    30180Комфорт-класс
    3150Эконом-класс
    3252Эконом-класс
    3355Эконом-класс
    3450Эконом-класс
    3570Эконом-класс
    3689Эконом-класс
    3735Эконом-класс
    3885Эконом-класс
    39150Комфорт-класс
    4040Эконом-класс
    4168Эконом-класс
    42120Эконом-класс
    43120Эконом-класс
    44135Эконом-класс
    45150Комфорт-класс
    46150Комфорт-класс
    47130Эконом-класс
    48110Эконом-класс
    49115Эконом-класс
    5080Эконом-класс

Однако для специальных случаев PostgreSQL предоставляет более специализированные функции.

Функции IFNULL и NULLIF

Помимо функции IF, в MySQL также есть более простые, но менее универсальные функции IFNULL и NULLIF, направленные на обработку NULL значений.

Синтаксис IFNULL

MySQL 8.1
IFNULL(значение, альтернативное_значение);

Функция IFNULL возвращает значение, переданное первым аргументом, если оно не равно NULL, иначе возвращает альтернативное_значение.

Функция COALESCE

Функция COALESCE - это элегантное решение для работы с NULL значениями. Она возвращает первое не-NULL значение из списка аргументов.

Синтаксис

MySQL 8.1
COALESCE(значение1, значение2, ..., значениеN);

Это намного удобнее, чем писать длинные CASE выражения для обработки NULL.

Сравнение подходов

С помощью CASE:

MySQL 8.1
CASE
    WHEN значение1 IS NOT NULL THEN значение1
    WHEN значение2 IS NOT NULL THEN значение2
    ELSE значение3
END

С помощью COALESCE (намного проще):

MySQL 8.1
COALESCE(значение1, значение2, значение3)

Примеры с функцией IFNULL

  • Если первый аргумент не равен NULL, то вернётся именно он.

    MySQL 8.1
    SELECT IFNULL('SQL Academy', 'Альтернатива SQL Academy') AS sql_trainer;
    
    sql_trainer
    SQL Academy

Примеры с функцией COALESCE

  • Если первый аргумент не равен NULL, то вернётся именно он.

    MySQL 8.1
    SELECT COALESCE('SQL Academy', 'Альтернатива SQL Academy') AS sql_trainer;
    
    coalesce
    SQL Academy
  • Если первый аргумент равен NULL, то вернётся значение, переданное вторым аргументом.

    MySQL 8.1
    SELECT IFNULL(NULL, 'Альтернатива SQL Academy') AS sql_trainer;
    
    sql_trainer
    Альтернатива SQL Academy
  • Если первый аргумент равен NULL, то вернётся следующее не-NULL значение.

    MySQL 8.1
    SELECT COALESCE(NULL, 'Альтернатива SQL Academy') AS sql_trainer;
    
    coalesce
    Альтернатива SQL Academy
  • COALESCE может принимать множество аргументов, что делает код очень читаемым:

    MySQL 8.1
    SELECT COALESCE(NULL, NULL, 'SQL Academy', 'Запасной вариант') AS sql_trainer;
    
    coalesce
    SQL Academy

Функция NULLIF

Функция NULLIF полезна, когда нужно заменить определенное значение на NULL. Это может пригодиться для фильтрации или обработки "пустых" значений.

Синтаксис NULLIF

MySQL 8.1
NULLIF(значение_1, значение_2);

Функция NULLIF возвращает NULL, если значение_1 равно значению_2, в противном случае возвращает значение_1.

Примеры с функцией NULLIF

  • Если значение первого аргумента равно значению второго аргумента, то возвращается NULL.

    MySQL 8.1
    SELECT NULLIF('SQL Academy', 'SQL Academy') AS sql_trainer;
    
    sql_trainer
    <NULL>
  • Если значение первого аргумента равно значению второго аргумента, то возвращается NULL.

    MySQL 8.1
    SELECT NULLIF('SQL Academy', 'SQL Academy') AS sql_trainer;
    
    nullif
    <NULL>
  • Если значения первого и второго аргумента различаются, то возвращается значение первого аргумента.

    MySQL 8.1
    SELECT NULLIF('SQL Academy', 'Альтернатива SQL Academy') AS sql_trainer;
    
    sql_trainer
    SQL Academy
  • Если значения первого и второго аргумента различаются, то возвращается значение первого аргумента.

    MySQL 8.1
    SELECT NULLIF('SQL Academy', 'Альтернатива SQL Academy') AS sql_trainer;
    
    nullif
    SQL Academy

Когда использовать каждую функцию:

  • CASE: Когда нужна сложная условная логика с множественными условиями
  • COALESCE: Когда нужно заменить NULL значения на значения по умолчанию
  • NULLIF: Когда нужно превратить определенные значения в NULL

Эти функции делают код более читаемым и являются частью стандарта SQL.