Условный SELECT в SQL: выбор колонки при NULL значении
Быстрый ответ
Для решения задачи используем функцию COALESCE
:
SELECT COALESCE(nullable_column, alternate_column) AS desired_output
FROM table_name
Функция COALESCE
возвращает первое значение, которое не равно NULL
. Таким образом, если nullable_column
равна NULL
, будет выбрано значение из alternate_column
.
Для более сложных условий подходит оператор CASE
:
SELECT CASE
WHEN nullable_column IS NULL THEN alternate_column
ELSE nullable_column
END AS desired_output
FROM table_name
В этом случае мы проверяем nullable_column
на NULL
, и если это так, выбираем значение alternate_column
, в противном случае — nullable_column
.
Глубокое погружение в стратегии обработки NULL
Два наиболее практичных инструмента для работы с NULL
— это COALESCE
и ISNULL
. COALESCE
может проверить несколько параметров, выбирая первый ненулевой из них. В SQL Server ISNULL
используется только для двух параметров. В Oracle для аналогичных задач применяется NVL
. Благодаря своим возможностям, COALESCE
наиболее ценится.
Визуализация
Принцип работы функции легче всего понять на аналогии с поиском фонарика с батарейками:
| Состояние фонарика | Выбор |
| ----------------------- | ----------------- |
| С батарейками (🔋) | Берём как есть (🔦) |
| Без батареек (null) | Добавляем батарейки (🔦+🔋) |
Если в фонарике нет батареек, мы их добавляем. Точно так же поступает и COALESCE
, выбирая первый рабочий фонарик. 🛒✨
Работа с сложными условиями и псевдонимами
Оператор CASE
особенно полезен при работе со сложными условиями, позволяя детально настроить логику выбора данных.
Например, если требуется использовать "InterimProgramID" вместо "ProgramID" в случае, когда "ProgramID" равен null, код будет следующим:
-- Если "ProgramID" отсутствует, приходит на помощь "InterimProgramID"!
SELECT CASE
WHEN ProgramID IS NULL THEN InterimProgramID
ELSE ProgramID
END AS ProgramID
FROM Programs;
Таким образом, возможно обеспечить корректное отображение названий столбцов, что важно для дальнейшей работы с данными или их визуализации в пользовательском интерфейсе.
Обращение с ситуациями множественных NULL
Когда в данных множество столбцов с NULL
, на помощь приходит COALESCE
, проверяющая столбцы последовательно до нахождения значения, отличного от NULL
.
-- Если "ProgramID" недоступен, "InterimProgramID" к вашим услугам. А в крайнем случае мы всегда можем опираться на "DefaultProgramID"!
SELECT COALESCE(ProgramID, InterimProgramID, DefaultProgramID) AS ProgramID
FROM Programs;
Функция последовательно проверяет "ProgramID", потом "InterimProgramID" и, в конце концов, "DefaultProgramID", если предыдущие столбцы содержат NULL
.
Полезные материалы
- SQL ISNULL(), NVL(), IFNULL() и COALESCE() Functions — ознакомьтесь с основами обработки значений NULL в различных диалектах SQL.
- CASE (Transact-SQL) – SQL Server | Microsoft Learn — изучите возможности использования условной логики в SQL Server.
- ISNULL (Transact-SQL) – SQL Server | Microsoft Learn — познакомьтесь с преимуществами замены NULL в SQL Server.
- sql – Using ISNULL vs using COALESCE for checking a specific condition? – Stack Overflow — присоединяйтесь к обсуждению сравнения ISNULL и COALESCE.
- PostgreSQL: Documentation: 16: 9.18. Conditional Expressions — PostgreSQL представляет способы управления NULL с помощью условных выражений.
- NULLIF (Transact-SQL) – SQL Server | Microsoft Learn — NULLIF учит игнорировать значения, когда два выражения эквивалентны в SQL Server.