ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Выбор не null значения из двух колонок в SQL: примеры

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

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

Чтобы отобрать значения из столбца, не содержащих NULL, используйте функцию COALESCE. Она ведёт себя как в игре в горячий картофель: предпочтение отдаётся первому значению, которое не NULL:

SQL
Скопировать код
SELECT COALESCE(col1, col2) AS result
FROM table;

В этой "игре" преимущество отдаётся col1, если это значение существует. Если нет, выбор переходит к col2. Поле result в итоге становится "победителем".

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Расширяем возможности SQL

COALESCE против IFNULL: что выбрать?

COALESCE выделяется как функция, соответствующая стандарту ANSI SQL, в то время как IFNULL более характерен для MySQL. Использование COALESCE позволяет универсализировать SQL-запросы для различных систем управления базами данных. Наверняка вы цените универсальность, не так ли?

Знакомьтесь, CASE: мультиинструмент SQL

Если перед вами стоит более сложная задача, чем просто выбор между первым не-null значением, то на помощь придёт выражение CASE. Оно рабоатет как блок if-else и может быть понятно для разработчика:

SQL
Скопировать код
SELECT CASE 
           WHEN col1 IS NOT NULL THEN col1 -- Если col1 есть
           ELSE col2                       -- col2 на замену
       END AS result
FROM table;

Обработка NULL: корректность превыше всего

Любой SQL-разработчик знает о важности целостности данных. Указанные функции ведут себя как проводник во тьме NULL значений, обеспечивая, что выбор данных будет осмысленным.

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

Для наглядности представьте себе ситуацию с шеф-поваром, который сталкивается с дилеммой выбора между ингредиентами:

Markdown
Скопировать код
Основной ингредиент (🍅): Свежий помидор
Альтернативный ингредиент (🍄): Гриб

Логика проста: если нет основного ингредиента (🍅), используйте альтернативный (🍄).

SQL
Скопировать код
SELECT COALESCE(preferred_ingredient, backup_ingredient) AS chosen_ingredient
FROM kitchen_shelf;

Готовое блюдо будет использовать доступные продукты:

Markdown
Скопировать код
Блюдо без 🍅: [🍄] 
Блюдо с 🍅:    [🍅]

Шеф-повар работает с тем, что имеет в наличии. Аналогично работает и SQL, обрабатывая значения NULL!

Не только COALESCE

Множество решений одной задачи

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

SQL
Скопировать код
-- В мире Oracle
SELECT NVL(col1, col2) AS result FROM table; -- NVL – звучит как шифровка?

-- В королевстве SQL Server
SELECT ISNULL(col1, col2) AS result FROM table; -- Потому что NULL никому не нравится

Использование OR — не без подводных камней

Если вы используете SELECT col1 OR col2 FROM table;, то, скорее всего, столкнётесь с проблемой. Запрос будет означать существование col1 или col2, но не выбор между ними. Лучше избегать таких нюансов булевой логики!

Подготовка данных: лучше перебдеть...

Беспокоит мысль о том, что нужно обработать "грязные" данные? Подумайте о возможности очистки данных от null значений заблаговременно. Установление значений по умолчанию при импорте или предварительной обработке данных может значительно упростить все последующие операции. Такую подготовку можно сравнить с утренней чашечкой кофе.

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

  1. Варианты использования функции Coalesce в SQL Server — подробное описание функции COALESCE.
  2. PostgreSQL: Документация: 9.18. Условные выражения — обработка значений NULL с помощью условных выражений в PostgreSQL.
  3. Рекомендации по использованию функции NVL в Oracle — подробное описание работы функции NVL в Oracle для работы с NULL значениями.