В отчёте нужно подставить запасное значение вместо NULL: как SQL выбирает результат выражения COALESCE?
COALESCE возвращает первое выражение слева направо, значение которого не равно NULL. Если все выражения равны NULL, результатом также будет NULL.
Это не проверка на пустую строку, ноль или ложное значение: такие значения считаются обычными, если они не являются NULL.
NULL появился в SQL как специальное обозначение отсутствующего или неизвестного значения. Обычных сравнений и подстановки значения по умолчанию оказалось недостаточно: запросам понадобилось безопасно описывать альтернативы без процедурного if.
COALESCE решает эту задачу декларативно и переносимо. Он позволяет задать несколько источников значения, выбирая первый доступный, например значение профиля, затем значение подразделения, затем системный запасной вариант.
Источник данных может содержать NULL, а прикладной отчёт или операция вставки ожидает отображаемое значение. Если просто вывести столбец, пользователь увидит NULL; если использовать обычное сравнение с NULL, условие не даст ожидаемого результата из-за трёхзначной логики SQL.
Неверно считать, что COALESCE заменяет любое «пустое» значение. Пустая строка, ноль и FALSE не являются NULL, поэтому они будут выбраны как первые подходящие значения.
SQL проверяет аргументы слева направо и возвращает первый аргумент, не являющийся NULL. Когда подходящего аргумента нет, результат — NULL.
Для каждой строки сначала проверяется preferred_name. Если он NULL, проверяется legal_name; если и он NULL, возвращается строковый литерал Без имени.
Логически COALESCE эквивалентен последовательному условному выражению CASE. При этом СУБД должна согласовать типы аргументов: например, числовые и строковые значения не всегда можно смешать без явного приведения.
У COALESCE есть важное практическое свойство: последующие аргументы не нужны после нахождения первого ненулевого значения. Однако нельзя использовать выражения с побочными эффектами как способ управления порядком вычислений: SQL не предназначен для таких побочных эффектов, а детали оптимизации зависят от СУБД.
COALESCE можно применять в SELECT, UPDATE, INSERT, сортировке и других выражениях. Но подстановка значения меняет только результат выражения, а не само значение NULL в таблице и не влияет автоматически на другие запросы.
В отчёте имя клиента должно выбираться из предпочтительного имени, затем из официального имени, а при отсутствии обоих отображаться как «Без имени».
Вариант с обработкой в приложении требует передавать дополнительные правила и может привести к различиям между отчётами. Вариант с несколькими отдельными запросами усложняет сопровождение и увеличивает число обращений к базе данных.
Выбранный вариант — COALESCE непосредственно в запросе. Правило выбора находится рядом с данными, единообразно применяется ко всем строкам и не изменяет исходные значения. Если бизнес-правило должно различать NULL и пустую строку, перед COALESCE нужна отдельная нормализация пустых строк, поскольку сам оператор их не пропускает.
Ноль будет возвращён как первый ненулевой аргумент. COALESCE проверяет именно NULL, а не «истинность» значения, поэтому ноль, FALSE и пустая строка не считаются отсутствующими.
Результат будет NULL. Если требуется гарантированное значение по умолчанию, последний аргумент должен быть ненулевым при допустимых типах, например строковым литералом для строкового результата или числом для числового результата.
Это зависит от правил разрешения типов конкретной СУБД, но аргументы должны быть совместимы с общим типом результата. Если автоматическое приведение невозможно или выбирается нежелательный тип, запрос завершится ошибкой либо даст неожиданное приведение. В критичных выражениях типы следует согласовать явно, особенно при смешивании чисел, дат и строк.