Dit is een goede vraag, en een die geen goed antwoord heeft. De behandeling van NULL
in uw twee voorbeelden is anders.
Het fundamentele probleem is wat NULL
middelen. Gewoonlijk wordt het gebruikt om ontbrekend aan te duiden waarden. In de ANSI-standaard staat het echter voor een onbekende waarde. Ik weet zeker dat filosofen boekdelen zouden kunnen wijden aan het verschil tussen "ontbrekend" en "onbekend".
In een eenvoudige uitdrukking (booleaans of rekenkundig of scalair van een andere soort), definieert ANSI het resultaat van "onbekend" in bijna alle gevallen waarin een van de operanden "onbekend" is. Er zijn enkele uitzonderingen:NULL AND FALSE
is onwaar en NULL IS NULL
is waar, maar deze zijn zeldzaam.
Denk voor de aggregatiebewerkingen aan SUM()
als "alle bekende waarden optellen", enzovoort. SUM()
behandelt NULL
waarden anders dan +
. Maar dit gedrag is ook standaard, dus zo werken alle databases.
Als je een NULL
. wilt waarde voor een aggregatie wanneer elke van zijn operanden is NULL
, dan moet je CASE
. gebruiken . Ik denk dat de gemakkelijkste manier voor een enkele kolom is:
(CASE WHEN COUNT(col) = COUNT(*) THEN SUM(COL) END)