To dobre pytanie, na które nie ma dobrej odpowiedzi. Traktowanie NULL w twoich dwóch przykładach jest inny.
Podstawowym problemem jest to, co NULL oznacza. Zwykle jest używany do oznaczenia brakującego wartości. Jednak w standardzie ANSI oznacza nieznany wartość. Jestem pewien, że filozofowie mogliby poświęcić tomy na różnicę między „zaginionym” a „nieznanym”.
W prostym wyrażeniu (boolowskim, arytmetycznym lub skalarnym innego rodzaju) ANSI definiuje wynik „nieznany” w prawie wszystkich przypadkach, gdy którykolwiek z operandów jest „nieznany”. Istnieje kilka wyjątków:NULL AND FALSE jest fałszywe, a NULL IS NULL to prawda, ale są to rzadkie przypadki.
W przypadku operacji agregacji pomyśl o SUM() jako „zsumuj wszystkie znane wartości” i tak dalej. SUM() traktuje NULL wartości inne niż + . Ale to zachowanie jest również standardowe, więc tak działają wszystkie bazy danych.
Jeśli chcesz NULL wartość dla agregacji, gdy dowolny jego operandów to NULL , musisz użyć CASE . Myślę, że najłatwiejszym sposobem na pojedynczą kolumnę jest:
(CASE WHEN COUNT(col) = COUNT(*) THEN SUM(COL) END)