2012-10-04 3 views
10

Ich verstehe, warumnull + 1 oder (1 + null) null zurück: null bedeutet „unbekannten Wert“, und wenn ein Wert nicht bekannt ist, ist sein Nachfolger als auch unbekannt. Das gleiche gilt für die meisten anderen Operationen mit null [*]Warum gibt SUM (...) in einem leeren Re-Cord-Set NULL statt 0 zurück?

jedoch ich verstehe nicht, warum das passiert folgendes:.

SELECT SUM(someNotNullableIntegerField) FROM someTable WHERE 1=0 

Diese Abfrage liefert null. Warum? Hier sind keine unbekannten Werte involviert! Die WHERE-Klausel gibt Null Aufzeichnungen, und die Summe aus einem leeren Satz von Werten ist 0. [**] Beachten Sie, dass sich das Gerät nicht unbekannt ist, ist es bekannt leer sein.

Ich weiß, dass ich durch die Verwendung ISNULL oder COALESCE, um dieses Verhalten zu arbeiten, aber ich versuche, zu verstehen, warum dieses Verhalten, das mir kontraintuitiv erscheint, gewählt.

Gibt es Einsichten, warum dies sinnvoll ist?


[*] mit einigen bemerkenswerten Ausnahmen wie null OR true, wo offensichtlich true ist das richtige Ergebnis, da der unbekannte Wert einfach keine Rolle spielt.

[**] genau wie das Produkt eines leeren Satzes von Werten ist 1. Wenn ich also $ (Z, +) $ zu $ ​​(Z union {null}, +) $ erweitern würde, wäre die offensichtliche Wahl für das Identitätselement mathematisch 0, nicht null, seit x + 0 = x, aber x + null = null.

+0

Vielleicht, weil Sie ein Aggregat verwenden. – Kermit

+0

Wenn Sie nichts hinzufügen, erhalten Sie nicht 0, Sie erhalten nichts. –

+0

Haben Sie sich den Ausführungsplan angesehen? – Kermit

Antwort

9

Der ANSI-SQL-Standard definiert das Ergebnis der SUMME einer leeren Menge als NULL. Warum sie das getan haben, kann ich nicht sagen, aber zumindest sollte das Verhalten in allen Datenbank-Engines konsistent sein.

Referenz: http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt auf Seite 126:

b) Wenn AVG, MAX, MIN oder SUM angegeben wird, dann

  Case: 

     i) If TXA is empty, then the result is the null value. 

TXA ist die operative Ergebnismenge aus der ausgewählten Spalte .

+0

Ich denke das ist für die Konsistenz, da der einzige vernünftige Wert für 'AVG',' MIN', 'MAX' ist, also denke ich, dass sie entschieden haben,' SUM' nicht zu einem Sonderfall zu machen. Der einzige Spezialfall ist "COUNT". Schade, der Standard beinhaltet nicht die Vernunft dahinter. –

+1

Ich habe angefangen [eine Frage auf dba.stackexchange.com] (http://dba.stackexchange.com/q/25435/5273) über * warum * es wurde auf diese Weise standardisiert. – Heinzi

0

Wenn Sie leere Tabelle meinen, meinen Sie eine Tabelle mit nur NULL Werten, deshalb erhalten wir NULL als Ausgabe für Aggregatfunktionen. Sie können dies als Entwurf für SQL Server betrachten.

Beispiel 1

CREATE TABLE testSUMNulls 
(
    ID TINYINT 
) 
GO 

INSERT INTO testSUMNulls (ID) VALUES (NULL),(NULL),(NULL),(NULL) 

SELECT SUM(ID) FROM testSUMNulls 

Beispiel 2

CREATE TABLE testSumEmptyTable 
(
    ID TINYINT 
) 
GO 

SELECT SUM(ID) Sums FROM testSumEmptyTable 

In beiden Beispielen werden Sie NULL als Ausgabe ..

+2

'Wenn Sie leere Tabelle meinen, meinen Sie eine Tabelle mit nur NULL-Werten,' ... nein, definitiv nicht. – Heinzi

Verwandte Themen