Условный SELECT в SQL: выбор колонки при NULL значении

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для решения задачи используем функцию COALESCE:

SQL
Скопировать код
SELECT COALESCE(nullable_column, alternate_column) AS desired_output
FROM table_name

Функция COALESCE возвращает первое значение, которое не равно NULL. Таким образом, если nullable_column равна NULL, будет выбрано значение из alternate_column.

Для более сложных условий подходит оператор CASE:

SQL
Скопировать код
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.

Кинга Идем в IT: пошаговый план для смены профессии

Глубокое погружение в стратегии обработки NULL

Два наиболее практичных инструмента для работы с NULL — это COALESCE и ISNULL. COALESCE может проверить несколько параметров, выбирая первый ненулевой из них. В SQL Server ISNULL используется только для двух параметров. В Oracle для аналогичных задач применяется NVL. Благодаря своим возможностям, COALESCE наиболее ценится.

Визуализация

Принцип работы функции легче всего понять на аналогии с поиском фонарика с батарейками:

Markdown
Скопировать код
| Состояние фонарика       | Выбор              |
| ----------------------- | ----------------- |
| С батарейками (🔋)       | Берём как есть (🔦) |
| Без батареек (null)     | Добавляем батарейки (🔦+🔋) |

Если в фонарике нет батареек, мы их добавляем. Точно так же поступает и COALESCE, выбирая первый рабочий фонарик. 🛒✨

Работа с сложными условиями и псевдонимами

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

Например, если требуется использовать "InterimProgramID" вместо "ProgramID" в случае, когда "ProgramID" равен null, код будет следующим:

SQL
Скопировать код
-- Если "ProgramID" отсутствует, приходит на помощь "InterimProgramID"!
SELECT CASE 
  WHEN ProgramID IS NULL THEN InterimProgramID 
  ELSE ProgramID 
END AS ProgramID
FROM Programs;

Таким образом, возможно обеспечить корректное отображение названий столбцов, что важно для дальнейшей работы с данными или их визуализации в пользовательском интерфейсе.

Обращение с ситуациями множественных NULL

Когда в данных множество столбцов с NULL, на помощь приходит COALESCE, проверяющая столбцы последовательно до нахождения значения, отличного от NULL.

SQL
Скопировать код
-- Если "ProgramID" недоступен, "InterimProgramID" к вашим услугам. А в крайнем случае мы всегда можем опираться на "DefaultProgramID"!
SELECT COALESCE(ProgramID, InterimProgramID, DefaultProgramID) AS ProgramID
FROM Programs;

Функция последовательно проверяет "ProgramID", потом "InterimProgramID" и, в конце концов, "DefaultProgramID", если предыдущие столбцы содержат NULL.

Полезные материалы

  1. SQL ISNULL(), NVL(), IFNULL() и COALESCE() Functions — ознакомьтесь с основами обработки значений NULL в различных диалектах SQL.
  2. CASE (Transact-SQL) – SQL Server | Microsoft Learn — изучите возможности использования условной логики в SQL Server.
  3. ISNULL (Transact-SQL) – SQL Server | Microsoft Learn — познакомьтесь с преимуществами замены NULL в SQL Server.
  4. sql – Using ISNULL vs using COALESCE for checking a specific condition? – Stack Overflow — присоединяйтесь к обсуждению сравнения ISNULL и COALESCE.
  5. PostgreSQL: Documentation: 16: 9.18. Conditional Expressions — PostgreSQL представляет способы управления NULL с помощью условных выражений.
  6. NULLIF (Transact-SQL) – SQL Server | Microsoft Learn — NULLIF учит игнорировать значения, когда два выражения эквивалентны в SQL Server.