Questa è una buona domanda e non ha una buona risposta. Il trattamento di NULL
nei tuoi due esempi è diverso.
Il problema fondamentale è cosa NULL
significa. Comunemente, è usato per denotare mancante i valori. Tuttavia, nello standard ANSI, sta per sconosciuto valore. Sono sicuro che i filosofi potrebbero dedicare dei tomi alla differenza tra "scomparso" e "sconosciuto".
In un'espressione semplice (booleana o aritmetica o scalare di altro tipo), ANSI definisce il risultato di "sconosciuto" in quasi tutti i casi in cui uno qualsiasi degli operandi è "sconosciuto". Ci sono alcune eccezioni:NULL AND FALSE
è falso e NULL IS NULL
è vero, ma sono rari.
Per le operazioni di aggregazione, pensa a SUM()
come "somma di tutti i valori noti" e così via. SUM()
considera NULL
valori diversi da +
. Ma anche questo comportamento è standard, quindi è così che funzionano tutti i database.
Se vuoi un NULL
valore per un'aggregazione quando qualsiasi dei suoi operandi è NULL
, quindi devi utilizzare CASE
. Penso che il modo più semplice per una singola colonna sia:
(CASE WHEN COUNT(col) = COUNT(*) THEN SUM(COL) END)