Дано выражение: CASE WHEN status = 'paid' THEN amount ELSE 0 END. Что вернётся, если status равно NULL, а amount равно 500?
AВернётся
NULL, потому что любое участие NULL в выражении автоматически делает результат неопределённымBВернётся
0: условие status = 'paid' даёт UNKNOWN из-за NULL, и поэтому сработает ветка ELSECВернётся
500: значение amount подставится напрямую, ведь поле status не равно строке 'paid'DБудет ошибка выполнения, потому что сравнение со значением
NULL запрещено в выражении CASEПравильный ответ. Если условие
WHEN даёт не TRUE (включая UNKNOWN из-за NULL), сработает ветка ELSE.Разбор
При status = NULL сравнение status = 'paid' возвращает UNKNOWN, а не TRUE или FALSE. В выражении CASE ветка WHEN срабатывает только при TRUE, поэтому в нашем случае выберется ELSE 0, и результат будет 0, даже если amount равно 500. Чтобы явно учитывать пропуски, можно добавить отдельную ветку WHEN status IS NULL THEN .... Запрета на сравнение с NULL в CASE нет — оно просто даёт UNKNOWN.
Проверь себя · 1/3разбор после ответа
В таблице
orders поле promo_code может быть NULL. Что произойдёт со строкой, где promo_code = NULL, при фильтре WHERE promo_code <> 'NONE'?Ещё вопросы по теме «Выражения и 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» →