tgoop.com/big_data_systems_analysis/161
Create:
Last Update:
Last Update:
NULL + 50: почему иногда арифметика работает не так, как ожидается
Продолжая серию статей про #null, не могу обойти стороной арифметику.
Допустим, мы хотим оценить, сколько всего товара будет на складе, и для этого складываем общий запас товаров с ожидаемыми поставками. Вот таблица с данными:
| product_id | current_stock | expected_delivery |
|------------|---------------|-------------------|
| 1 | 100 | 20 |
| 2 | 50 | NULL |
| 3 | 200 | 30 |
Выполняем запрос:
SELECT
product_id,
current_stock + expected_delivery AS total_stock
FROM inventory;
Результат выполнения будет таким:
| product_id | total_stock |
|------------|-------------|
| 1 | 120 |
| 2 | NULL |
| 3 | 230 |
Почему для второго продукта итог оказался NULL вместо 50?
И тут пора вспомнить то, о чём я всё время напоминаю. NULL — это не число, а специальный маркер. Он говорит "здесь что-то должно быть, но я не знаю что". И его нельзя использовать в любых арифметических операциях с числами напрямую, поскольку это "неопределенность". И когда мы просим прибавить к числу неизвестность, в результате мы также получаем неизвестность.
Что делать?
Как и всегда, важно всегда обрабатывать NULL-значения. Тут нам снова помогут функции
COALESCE
и IFNULL
:
SELECT
product_id,
current_stock + COALESCE(expected_delivery, 0) AS total_stock
FROM inventory;
Функция
COALESCE
проверяет, является ли значение expected_delivery NULL, и если это так, подставляет 0. Так мы избегаем возможной ошибки, которой точно не место в наших в отчётах.#null