2017-04-03 2 views
1

Wenn ich zwei Spalten v und w zusammenaddiere, geben die Ergebnisse der Zeilen NULL, wenn einer oder beide Summanden NULL sind. Das macht Sinn. Aber wenn ich über die Spalte mit SUM(v) summiere, wird es ein numerisches Ergebnis geben, sogar dort sind NULL s. Liegt das an praktischer Erfahrung? Oder gibt es eine theoretische Begründung? HierSQL-Diskrepanz zwischen dem Hinzufügen von Spalten und dem Summieren von Spalten mit NULL-Werten

ist ein Beispiel zu klären (MySQL und SQLite):

CREATE TABLE x0 (
    id INTEGER 
, v  DOUBLE 
, w  DOUBLE 
); 

INSERT INTO x0 VALUES 
    (1, 1,  1) 
, (2, 1,  1) 
, (3, NULL,  1) 
, (4, 1, NULL) 
, (5, NULL, NULL) 
; 

-- NULL if summand is NULL 
SELECT v+w 
FROM x0 
; 
-- v+w 
-- 2 
-- 2 
-- \N 
-- \N 
-- \N 

-- NULL if summand is NULL 
SELECT id, v+w, SUM(v+w) 
FROM x0 
GROUP BY id 
; 
-- id v+w SUM(v+w) 
-- 1 2 2 
-- 2 2 2 
-- 3 \N \N 
-- 4 \N \N 
-- 5 \N \N 


-- There is numeric results even if some summands are NULL  
SELECT SUM(v), SUM(w) 
FROM x0 
; 
-- SUM(v) SUM(w) 
-- 3  3 
+1

SQL ist weit davon entfernt, eine solide und konsistente theoretische Grundlage zu haben. Akzeptieren Sie einfach, dass der Standard die Operationen definiert. "Theoretisch" sollte der Wert "NULL" sein, wenn eines der Argumente "NULL" ist, weil "NULL" -Werte unbestimmt sind. –

+0

@GordonLinoff Ich dachte, dass SQL auf Mengenlehre basiert. Aus Gründen der Einfachheit scheint es in einigen Fällen mathematische Gründlichkeit zu geben, zum Beispiel mit Funktionen wie "SUMME". – giordano

+1

Standard-SQL ignoriert/entfernt NULLs innerhalb von Aggregationsfunktionen. Andernfalls würden Sie COALESCE auf Nullable Spalten wie 'MIN (COALESCE (mycolumn verwenden müssen, 9999999)' und dann ist es schwer zu wissen, ob ein zurück 9999999 tatsächlich der niedrigste Wert oder der NULL-Ersatz ist. – dnoeth

Antwort

1

ISO/IEC 9075:1992 Database Language SQL sagt in Abschnitt 6.5 (< Set-Funktion Spezifikation>), Allgemeine Regeln verwalten , 1) b):

lassen TX das Einsäulen-Tabelle, die das Ergebnis der Anwendung die < Wertausdruck ist>, um jede Zeile von T und Nullwerte eliminieren.

Und das ist alles, was es sagt. Also Aggregatfunktionen müssen NULL ignorieren, aber offiziell gibt es keine Rechtfertigung.

Dieses Verhalten geht zurück auf die ersten SQL-Implementierungen (IBM System R, Oracle V2), wo die Designer wohl gedacht, das eine gute Idee wäre. Und später wollte niemand die Rückwärtskompatibilität brechen.

In diesem Aspekt, wie es in anderen, ist SQL's handling of NULL values inkonsistent, und manchmal nicht tragbar.

Verwandte Themen