Хотя вы уже приняли другой ответ, я бы сказал, что использование NULL на самом деле является лучшим выбором по нескольким причинам.
Первая причина заключается в том, что агрегаты возвращают «правильный» ответ (т. Е. Тот, который пользователи обычно ожидают), когда присутствует NULL, но дают «неправильный» ответ, когда вы используете ноль. Рассмотрим результаты AVG () в этих двух запросах:
-- with zero; gives 1.5
select SUM(measure), AVG(measure)
from
(
select 1.0 as 'measure'
union all
select 2.0
union all
select 3.0
union all
select 0
) dt
-- with null; gives 2
select SUM(measure), AVG(measure)
from
(
select 1.0 as 'measure'
union all
select 2.0
union all
select 3.0
union all
select null
) dt
Если мы предположим, что показателем здесь является «количество дней на изготовление изделия», а NULL представляет изделие, которое все еще производится, то ноль дает неправильный ответ. То же самое относится и к MIN () и MAX ().
Вторая проблема заключается в том, что если ноль является значением по умолчанию, то как вы различаете ноль в качестве значения по умолчанию и ноль в качестве реального значения? Например, рассмотрим меру «транспортные расходы в евро», когда NULL означает, что клиент сам принял заказ, поэтому не было никаких расходов на доставку, а ноль означает, что заказ был отправлен клиенту бесплатно. Вы не можете использовать ноль для замены NULL без полного изменения значения данных. Вы, очевидно, можете утверждать, что это различие должно быть четким по сравнению с другими измерениями (например, методом доставки), но это увеличивает сложность отчетов и понимания данных.