IFNULL и COALESCE в MySQL и MS SQL: чем отличаются?
Быстрый ответ
Если не хотите вникать в детали: функция IFNULL работает с двумя аргументами — смотрит на первый, и если он NULL, то возвращает второй. В то же время, COALESCE может работать с множеством аргументов и возвращает первый из них, который не NULL. Например, вот как можно использовать IFNULL, для замены null-значения на указанный текст:
SELECT IFNULL(column_name, 'Старик Макдональд имел ферму!');
А вот так используется COALESCE, для выбора первого из списка не-NULL значений:
SELECT COALESCE(column1, column2, 'Е-М-Н-О-G-А-М-Е SQL!');
В отличие от IFNULL, специфичной только для MySQL, COALESCE соответствует стандарту SQL и предоставляет лучшую совместимость между разными системами управления базами данных.

Взаимодействие с типами данных: IFNULL vs COALESCE
У функции IFNULL тип возвращаемого значения определяется на основе типов обоих её параметров. В отличие от неё, COALESCE возвращает тип данных с наибольшим приоритетом из всех определенных не-NULL значений, что помогает избежать некорректных сравнений различных типов.
Подход SQL Server: ISNULL
В Microsoft SQL Server используется ISNULL, аналог MySQL-овской IFNULL. Важно отметить, что она требует совпадения типов всех своих аргументов, что может утяжелять работу с различными типами данных и их преобразованиями.
Универсальность COALESCE
Для обработки большого количества потенциальных NULL значений или для написания запросов, совместимых с разными СУБД, COALESCE является по-настоящему универсальной и стандартизированной функцией SQL. Это истинный многофункциональный инструмент среди SQL-функций!
Особенности производительности
С точки зрения производительности: IFNULL работает быстрее, однако COALESCE, ввиду обработки нескольких параметров, может быть полезнее при больших объемах данных. Впрочем, COALESCE может ухудшить производительность при работе с тяжёлыми запросами, так как функция проверяет параметры до нахождения первого не NULL значения.
Визуализация
Можно представить IFNULL и COALESCE как 'сети безопасности' для канатного акробата:
Акробат 🤸♀️ взмыл ввысь:
Канат A (🧬): [Сальто назад, NULL, Удвоенный перешагиватель]
Канат B (🧬): [NULL, Флик штук, Удвоенный перешагиватель]
IFNULL = Первая сеть безопасности под акробатом
🧬👇🤸♀️: [Сальто назад, **Флик штук**, Удвоенный перешагиватель]
# IFNULL — как надёжная сеть, оберегающая акробата в любой ситуации.
COALESCE = Все сети безопасности сразу
🧬👇👇🤸♀️: [**Сальто назад**, Флик штук, Удвоенный перешагиватель]
# COALESCE "ловит" акробата при первом же не-NULL трюке на любом из канатов.
"Сети безопасности" здесь — это альтернативные планы действий: IFNULL предлагает всего одну альтернативу, в то время как COALESCE проверяет все варианты до тех пор, пока не найдёт не-NULL значение.
Особые случаи, на которые стоит обратить внимание
У IFNULL и COALESCE есть свои слабые стороны. С IFNULL, если первый аргумент не NULL, второй даже не рассматривается, что может привести к неожиданным результатам:
SELECT IFNULL(column_name, 'Эм... Неудобно получилось...'); -- Не расстраивайтесь, второй аргумент, IFNULL просто вас проигнорировал.
COALESCE, в свою очередь, тщательно проверяет каждый аргумент. Это может замедлить выполнение, особенно если первыми в списке аргументов идут "тяжёлые" вычисления или подзапросы.
Практические рекомендации по использованию IFNULL и COALESCE
Несколько советов на практике:
IFNULLотлично подходит, когда нужно заменить одиночныеNULLзначения на значение по умолчанию.COALESCEбудет полезнее в ситуациях с большим количеством потенциальныхNULLзначений, а также если вам нужно выполнение запросов на различных СУБД.- Располагайте ресурсоемкие функции и подзапросы ближе к концу списка аргументов
COALESCE, чтобы избежать лишней нагрузки на систему. - Знание и умение работать с обеими функциями делают вас востребованным специалистом. Поэтому важно постоянно практиковаться и совершенствовать свои навыки!
Полезные материалы
- Функция MySQL IFNULL() — подробное руководство по использованию IFNULL в MySQL.
- Функция MySQL COALESCE() — все об использовании COALESCE в MySQL.
- MySQL :: Руководство по ссылке MySQL 8.0 :: 14.4.2 Функции сравнения и операторы — официальная документация MySQL по COALESCE: много примеров и детальное описание синтаксиса.