Есть выражение для маржи: revenue - cost. Что получится, если revenue = 1000, а cost = NULL? И какой вариант устойчиво вернёт 1000 при пропущенном cost?

AРезультат 1000; устойчивый вариант: оставить выражение revenue - cost без изменений и доверять движку
BРезультат NULL; устойчивый вариант: явно вычитать неизвестное значение через revenue - NULL как маркер
CРезультат 0; устойчивый вариант: обернуть всю разность через COALESCE(revenue - cost, 0) после вычисления
DРезультат NULL; устойчивый вариант: заменить пропуск нулём заранее через revenue - COALESCE(cost, 0)
Правильный ответ. Любая арифметика с NULL даёт NULL; для подстановки значения по умолчанию используйте COALESCE до вычисления.

Разбор

Если один из операндов в арифметике равен NULL, результат всего выражения становится NULL, потому что значение «неизвестно» и любая операция с ним тоже неизвестна. Поэтому revenue - cost при cost = NULL даёт NULL, а не 1000. Чтобы трактовать пропущенную себестоимость как 0 (частая аналитическая договорённость), её заменяют до вычитания: revenue - COALESCE(cost, 0). Вариант с COALESCE(revenue - cost, 0) маскирует NULL нулём только после вычисления, что даёт уже 0, а не 1000 — это другое бизнес-правило.

Проверь себя · 1/3разбор после ответа
Нужно посчитать выручку как price * quantity, где quantity может быть NULL (поле не заполнили). По бизнес-правилу пропуск нужно трактовать как 1. Какое выражение корректнее?
Тренировать SQL в Telegram

Ещё вопросы по теме «Выражения и NULL»