Выбор не null значения из двух колонок в SQL: примеры
Быстрый ответ
Чтобы отобрать значения из столбца, не содержащих NULL, используйте функцию COALESCE
. Она ведёт себя как в игре в горячий картофель: предпочтение отдаётся первому значению, которое не NULL:
SELECT COALESCE(col1, col2) AS result
FROM table;
В этой "игре" преимущество отдаётся col1
, если это значение существует. Если нет, выбор переходит к col2
. Поле result
в итоге становится "победителем".
Расширяем возможности SQL
COALESCE
против IFNULL
: что выбрать?
COALESCE
выделяется как функция, соответствующая стандарту ANSI SQL, в то время как IFNULL
более характерен для MySQL. Использование COALESCE
позволяет универсализировать SQL-запросы для различных систем управления базами данных. Наверняка вы цените универсальность, не так ли?
Знакомьтесь, CASE
: мультиинструмент SQL
Если перед вами стоит более сложная задача, чем просто выбор между первым не-null значением, то на помощь придёт выражение CASE
. Оно рабоатет как блок if-else и может быть понятно для разработчика:
SELECT CASE
WHEN col1 IS NOT NULL THEN col1 -- Если col1 есть
ELSE col2 -- col2 на замену
END AS result
FROM table;
Обработка NULL: корректность превыше всего
Любой SQL-разработчик знает о важности целостности данных. Указанные функции ведут себя как проводник во тьме NULL значений, обеспечивая, что выбор данных будет осмысленным.
Визуализация
Для наглядности представьте себе ситуацию с шеф-поваром, который сталкивается с дилеммой выбора между ингредиентами:
Основной ингредиент (🍅): Свежий помидор
Альтернативный ингредиент (🍄): Гриб
Логика проста: если нет основного ингредиента (🍅), используйте альтернативный (🍄).
SELECT COALESCE(preferred_ingredient, backup_ingredient) AS chosen_ingredient
FROM kitchen_shelf;
Готовое блюдо будет использовать доступные продукты:
Блюдо без 🍅: [🍄]
Блюдо с 🍅: [🍅]
Шеф-повар работает с тем, что имеет в наличии. Аналогично работает и SQL, обрабатывая значения NULL!
Не только COALESCE
Множество решений одной задачи
Если заглянуть за рамки функции COALESCE
, то пользователи Oracle скорее выберут NVL
, а в SQL Server оптимальнейвыбрать ISNULL
. Все эти функции решают одну и ту же задачу: обработать NULL
так, чтобы он не страшил. Вот примеры их применения:
-- В мире 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 значений заблаговременно. Установление значений по умолчанию при импорте или предварительной обработке данных может значительно упростить все последующие операции. Такую подготовку можно сравнить с утренней чашечкой кофе.
Полезные материалы
- Варианты использования функции Coalesce в SQL Server — подробное описание функции
COALESCE
. - PostgreSQL: Документация: 9.18. Условные выражения — обработка значений NULL с помощью условных выражений в PostgreSQL.
- Рекомендации по использованию функции NVL в Oracle — подробное описание работы функции
NVL
в Oracle для работы с NULL значениями.