В таблице payments три строки со значениями amount: NULL, NULL, NULL. Что вернут запросы SELECT SUM(amount) и SELECT SUM(COALESCE(amount, 0))?
AОба запроса вернут
NULL, потому что SUM всегда наследует NULL от значений столбцаB
SUM(amount) вернёт 0, а SUM(COALESCE(amount, 0)) вернёт NULL из-за пустого набора значенийC
SUM(amount) вернёт NULL, а SUM(COALESCE(amount, 0)) вернёт 0, потому что COALESCE заменяет каждый NULL на 0DОба запроса вернут 0, потому что агрегаты на пустых данных по правилам SQL дают 0 по умолчанию
Правильный ответ. Агрегаты пропускают
NULL, но если все значения NULL, SUM возвращает NULL; COALESCE превращает NULL в 0 до суммирования.Разбор
SUM пропускает NULL, но если ни одного не-NULL значения не нашлось, агрегат возвращает NULL — складывать нечего. Если же сначала применить COALESCE(amount, 0), то каждое NULL превратится в 0, и сумма станет 0. Это типичный приём для устойчивых метрик, когда отсутствие значения нужно трактовать как ноль. Поэтому два запроса дают разный результат: NULL и 0 соответственно.
Проверь себя · 1/3разбор после ответа
Дано выражение:
CASE WHEN status = 'paid' THEN amount ELSE 0 END. Что вернётся, если status равно NULL, а amount равно 500?Ещё вопросы по теме «Выражения и 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)`?
- Что вернёт выражение `COALESCE(NULL, NULL, 'web', 'app')`?
- Дано выражение: `CASE WHEN status = 'paid' THEN amount ELSE 0 END`. Что вернётся, если `status` равно `NULL`, а `amount` равно 500?
- Все вопросы по «Выражения и NULL» →