В таблице orders поле promo_code может быть NULL. Что произойдёт со строкой, где promo_code = NULL, при фильтре WHERE promo_code <> 'NONE'?
AСтрока всегда попадёт в результат, потому что
NULL «не равно» NONEBСтрока не попадёт в результат, потому что выражение
promo_code <> 'NONE' даст UNKNOWNCСтрока попадёт в результат только если есть
ORDER BYDSQL выдаст ошибку, потому что
<> нельзя применять к NULLПравильный ответ. Сравнение с
NULL даёт UNKNOWN, а WHERE оставляет только TRUE.Разбор
В три-значной логике результат сравнения с NULL — это UNKNOWN. Для строки с promo_code = NULL условие promo_code <> 'NONE' не является ни TRUE, ни FALSE. В WHERE отбираются только строки, для которых условие TRUE, поэтому строка с NULL будет исключена. Если нужно явно включать NULL, добавляют OR promo_code IS NULL или используют COALESCE(promo_code, '...') в зависимости от требуемого смысла.
Проверь себя · 1/3разбор после ответа
Есть выражение для маржи:
revenue - cost. Что получится, если revenue = 1000, а cost = NULL? И какой вариант устойчиво вернёт 1000 при пропуске cost?Ещё вопросы по теме «Выражения и NULL»
- Нужно выбрать пользователей без email. Какое условие в `WHERE` корректно найдёт строки, где `email` отсутствует (равен `NULL`)?
- В таблице `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')`?
- Дано выражение: `CASE WHEN status = 'paid' THEN amount ELSE 0 END`. Что вернётся, если `status` = `NULL` и `amount` = 500?
- Все вопросы по «Выражения и NULL» →