Това е добър въпрос и такъв, който няма добър отговор. Лечението на NULL
в двата ви примера е различно.
Основният проблем е какво NULL
означава. Обикновено се използва за обозначаване на липсващи стойности. Въпреки това, в стандарта ANSI това означава неизвестно стойност. Сигурен съм, че философите биха могли да посветят томове на разликата между „липсващ“ и „неизвестен“.
В прост израз (булев или аритметичен или скаларен от друг вид), ANSI дефинира резултата от "неизвестно" в почти всички случаи, когато някой от операндите е "неизвестен". Има някои изключения:NULL AND FALSE
е false и NULL IS NULL
е вярно, но те са рядкост.
За операциите за агрегиране помислете за SUM()
като "сумиране на всички известни стойности" и т.н. SUM()
третира NULL
стойности, различни от +
. Но това поведение също е стандартно, така че всички бази данни работят по този начин.
Ако искате NULL
стойност за агрегиране, когато някакво на неговите операнди е NULL
, тогава трябва да използвате CASE
. Мисля, че най-лесният начин за една колона е:
(CASE WHEN COUNT(col) = COUNT(*) THEN SUM(COL) END)