Dette er et godt spørgsmål, og et der ikke har et godt svar. Behandlingen af NULL
i dine to eksempler er forskellig.
Det grundlæggende problem er hvad NULL
midler. Almindeligvis bruges det til at betegne manglende værdier. Men i ANSI-standarden står det for en ukendt værdi. Jeg er sikker på, at filosoffer kunne vie tomes til forskellen mellem "manglende" og "ukendt".
I et simpelt udtryk (boolesk eller aritmetisk eller skalar af en anden art), definerer ANSI resultatet af "ukendt" i næsten alle tilfælde, hvor nogen af operanderne er "ukendte". Der er nogle undtagelser:NULL AND FALSE
er falsk og NULL IS NULL
er sandt, men disse er sjældne.
For aggregeringsoperationer skal du tænke på SUM()
som "sum alle kendte værdier", og så videre. SUM()
behandler NULL
værdier anderledes end +
. Men denne adfærd er også standard, så det er sådan alle databaser fungerer.
Hvis du vil have en NULL
værdi for en aggregering, når enhver af dens operander er NULL
, så skal du bruge CASE
. Jeg tror, at den nemmeste måde for en enkelt kolonne er:
(CASE WHEN COUNT(col) = COUNT(*) THEN SUM(COL) END)