Das ist eine gute Frage, auf die es keine gute Antwort gibt. Die Behandlung von NULL
in Ihren beiden Beispielen ist anders.
Das grundlegende Problem ist, was NULL
ist meint. Üblicherweise wird es verwendet, um fehlend zu bezeichnen Werte. Im ANSI-Standard steht es jedoch für ein unbekanntes Wert. Ich bin sicher, Philosophen könnten Bücher über den Unterschied zwischen „fehlend“ und „unbekannt“ schreiben.
In einem einfachen Ausdruck (Boolean oder Arithmetik oder Skalar anderer Art) definiert ANSI das Ergebnis "unbekannt" in fast allen Fällen, in denen einer der Operanden "unbekannt" ist. Es gibt einige Ausnahmen:NULL AND FALSE
ist falsch und NULL IS NULL
stimmt, aber diese sind selten.
Denken Sie für die Aggregationsoperationen an SUM()
als „alle bekannten Werte summieren“ und so weiter. SUM()
behandelt NULL
Werte anders als +
. Aber dieses Verhalten ist auch Standard, so funktionieren alle Datenbanken.
Wenn Sie einen NULL
wollen Wert für eine Aggregation, wenn beliebig seiner Operanden ist NULL
, dann müssen Sie CASE
verwenden . Ich denke, der einfachste Weg für eine einzelne Spalte ist:
(CASE WHEN COUNT(col) = COUNT(*) THEN SUM(COL) END)