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)