To je dobrá otázka, na kterou není dobrá odpověď. Zacházení s NULL
ve vašich dvou příkladech se liší.
Základní problém je v tom, co NULL
prostředek. Běžně se používá k označení chybějící hodnoty. Ve standardu ANSI však znamená neznámé hodnota. Jsem si jistý, že filozofové by mohli věnovat svazky rozdílu mezi „chybějícím“ a „neznámým“.
V jednoduchém výrazu (booleovský nebo aritmetický nebo skalární jiného druhu) ANSI definuje výsledek „neznámý“ téměř ve všech případech, kdy je některý z operandů „neznámý“. Existuje několik výjimek:NULL AND FALSE
je nepravda a NULL IS NULL
je pravda, ale ty jsou vzácné.
Pro operace agregace si představte SUM()
jako "součet všech známých hodnot" a tak dále. SUM()
zachází s NULL
hodnoty se liší od +
. Ale toto chování je také standardní, takže tak fungují všechny databáze.
Pokud chcete NULL
hodnota pro agregaci, když je jakýkoli jeho operandů je NULL
, pak musíte použít CASE
. Myslím, že nejjednodušší způsob pro jeden sloupec je:
(CASE WHEN COUNT(col) = COUNT(*) THEN SUM(COL) END)