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
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. –
@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
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