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)