Есть выражение для маржи: 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. Какое выражение корректнее?Ещё вопросы по теме «Выражения и NULL»
- Нужно выбрать пользователей без электронной почты. Какое условие в `WHERE` корректно найдёт строки, где `email` отсутствует?
- В таблице `orders` поле `promo_code` может быть `NULL`. Что произойдёт со строкой, где `promo_code = NULL`, при фильтре `WHERE promo_code <> 'NONE'`?
- В таблице `sessions` 5 строк. Значения `utm_source`: `'google'`, `NULL`, `'email'`, `NULL`, `NULL`. Чему равны `COUNT(*)` и `COUNT(utm_source)`?
- В таблице `payments` три строки со значениями `amount`: `NULL`, `NULL`, `NULL`. Что вернут запросы `SELECT SUM(amount)` и `SELECT SUM(COALESCE(amount, 0))`?
- Что вернёт выражение `COALESCE(NULL, NULL, 'web', 'app')`?
- Все вопросы по «Выражения и NULL» →