Условная функция IF
В предыдущем уроке мы рассматривали оператор CASE для реализации условной логики в SQL. Однако это не единственный механизм, с помощью которого возможно реализовать ветвление логики в запросе. Пришло время обратить наше внимание на функцию IF.
Синтаксис IF
IF(условие, значение_если_истина, значение_если_ложь)- условие
- Проверяемое логическое выражение, например price > 100.
- значение_если_истина
Значение, которое вернёт IF, если условие истинно.
- значение_если_ложь
Значение, которое вернёт IF, если условие ложно или равно NULL.
Дополнительные функции условной логики
В предыдущем уроке мы изучили оператор CASE для реализации условной логики в SQL. PostgreSQL предоставляет дополнительные функции, которые упрощают работу с условной логикой в специальных случаях. Эти функции особенно полезны при работе с NULL значениями и создании более читаемого кода.
Функции для условной логики
Помимо универсального оператора CASE, PostgreSQL предоставляет:
- Функция COALESCE - для работы с NULL значениями
- Функция NULLIF - для специальных случаев с NULL
Эти функции являются стандартными SQL функциями и делают код более читаемым в определенных ситуациях.
Примеры
-
Простое сравнение двух чисел. Так как 10 не больше 20, функция вернёт 'FALSE'.
MySQL 8.4SELECT IF(10 > 20, 'TRUE', 'FALSE');
-
Простой пример условной логики с помощью оператора CASE из предыдущего урока:
MySQL 8.4SELECT CASE WHEN 10 > 20 THEN 'TRUE' ELSE 'FALSE' END;
-
Пример использования с реальной БД. Необходимо на основании цены определить принадлежность жилья к одному из двух классов: "Комфорт-класс" и "Эконом-класс". Если цена больше или равна 150, то это жильё относится к "Комфорт-класс".
MySQL 8.4SELECT id, price, IF(price >= 150, 'Комфорт-класс', 'Эконом-класс') AS category FROM Rooms
-
Пример с реальными данными. Оператор CASE помогает категоризировать жильё по цене:
MySQL 8.4SELECT id, price, CASE WHEN price >= 150 THEN 'Комфорт-класс' ELSE 'Эконом-класс' END AS category FROM Rooms
-
Функции IF можно также вкладывать друг в друга, эмулируя оператор CASE.
MySQL 8.4SELECT id, price, IF(price >= 200, 'Бизнес-класс', IF(price >= 150, 'Комфорт-класс', 'Эконом-класс')) AS category FROM Rooms
-
CASE отлично подходит для множественных условий:
MySQL 8.4SELECT id, price, CASE WHEN price >= 200 THEN 'Бизнес-класс' WHEN price >= 150 THEN 'Комфорт-класс' ELSE 'Эконом-класс' END AS category FROM Rooms
Однако для специальных случаев PostgreSQL предоставляет более специализированные функции.
Функции IFNULL и NULLIF
Помимо функции IF, в MySQL также есть более простые, но менее универсальные функции IFNULL и NULLIF, направленные на обработку NULL значений.
Синтаксис IFNULL
IFNULL(значение, альтернативное_значение)- значение
Проверяемое значение, например столбец, в котором бывает NULL. Если оно не равно NULL, функция вернёт его.
- альтернативное_значение
Значение, которое функция вернёт, если значение равно NULL.
Функция COALESCE
Функция COALESCE - это элегантное решение для работы с NULL значениями. Она возвращает первое не-NULL значение из списка аргументов.
Синтаксис
COALESCE(значение [, ...])- [ ]необязательная часть
- ...можно повторить
- значение
Значения через запятую, например столбцы таблицы. Они проверяются слева направо, а последним можно указать запасное значение.
Это намного удобнее, чем писать длинные CASE выражения для обработки NULL.
Сравнение подходов
С помощью CASE:
MySQL 8.4CASE WHEN значение1 IS NOT NULL THEN значение1 WHEN значение2 IS NOT NULL THEN значение2 ELSE значение3 END
С помощью COALESCE (намного проще):
MySQL 8.4COALESCE(значение1, значение2, значение3)
Примеры с функцией IFNULL
-
Если первый аргумент не равен NULL, то вернётся именно он.
MySQL 8.4SELECT IFNULL('SQL Academy', 'Альтернатива SQL Academy') AS sql_trainer;
Примеры с функцией COALESCE
-
Если первый аргумент не равен NULL, то вернётся именно он.
MySQL 8.4SELECT COALESCE('SQL Academy', 'Альтернатива SQL Academy') AS sql_trainer;
-
Если первый аргумент равен NULL, то вернётся значение, переданное вторым аргументом.
MySQL 8.4SELECT IFNULL(NULL, 'Альтернатива SQL Academy') AS sql_trainer;
-
Если первый аргумент равен NULL, то вернётся следующее не-NULL значение.
MySQL 8.4SELECT COALESCE(NULL, 'Альтернатива SQL Academy') AS sql_trainer; -
COALESCE может принимать множество аргументов, что делает код очень читаемым:
MySQL 8.4SELECT COALESCE(NULL, NULL, 'SQL Academy', 'Запасной вариант') AS sql_trainer;
Функция NULLIF
Функция NULLIF полезна, когда нужно заменить определенное значение на NULL. Это может пригодиться для фильтрации или обработки "пустых" значений.
Синтаксис NULLIF
NULLIF(значение_1, значение_2)- значение_1
Значение, которое функция вернёт, если оно не равно значение_2.
- значение_2
Значение для сравнения. Если значение_1 равно ему, функция вернёт NULL.
Примеры с функцией NULLIF
-
Если значение первого аргумента равно значению второго аргумента, то возвращается NULL.
MySQL 8.4SELECT NULLIF('SQL Academy', 'SQL Academy') AS sql_trainer;
-
Если значение первого аргумента равно значению второго аргумента, то возвращается NULL.
MySQL 8.4SELECT NULLIF('SQL Academy', 'SQL Academy') AS sql_trainer;
-
Если значения первого и второго аргумента различаются, то возвращается значение первого аргумента.
MySQL 8.4SELECT NULLIF('SQL Academy', 'Альтернатива SQL Academy') AS sql_trainer;
-
Если значения первого и второго аргумента различаются, то возвращается значение первого аргумента.
MySQL 8.4SELECT NULLIF('SQL Academy', 'Альтернатива SQL Academy') AS sql_trainer;
Когда использовать каждую функцию:
- CASE: Когда нужна сложная условная логика с множественными условиями
- COALESCE: Когда нужно заменить NULL значения на значения по умолчанию
- NULLIF: Когда нужно превратить определенные значения в NULL
Эти функции делают код более читаемым и являются частью стандарта SQL.