Detta är en bra fråga, och en som inte har ett bra svar. Behandlingen av NULL
i dina två exempel är olika.
Det grundläggande problemet är vad NULL
betyder att. Vanligtvis används det för att beteckna saknad värden. Men i ANSI-standarden står det för okänt värde. Jag är säker på att filosofer skulle kunna ägna sig åt skillnaden mellan "saknad" och "okänt".
I ett enkelt uttryck (booleskt eller aritmetiskt eller skalärt av annat slag), definierar ANSI resultatet av "okänt" i nästan alla fall där någon av operanderna är "okänd". Det finns några undantag:NULL AND FALSE
är falsk och NULL IS NULL
är sant, men dessa är sällsynta.
För aggregeringsoperationer, tänk på SUM()
som "summa alla kända värden", och så vidare. SUM()
behandlar NULL
värden skiljer sig från +
. Men detta beteende är också standard så det är så alla databaser fungerar.
Om du vill ha en NULL
värde för en aggregering när någon av dess operander är NULL
, då måste du använda CASE
. Jag tror att det enklaste sättet för en enskild kolumn är:
(CASE WHEN COUNT(col) = COUNT(*) THEN SUM(COL) END)