capisco perchénull + 1
o (1 + null
) restituisce null
: null
significa "valore sconosciuto", e se un valore è sconosciuto, il suo successore è sconosciuto pure. Lo stesso vale per la maggior parte delle altre operazioni che coinvolgono nullo [*]Perché SUM (...) su un recordset vuoto restituisce NULL anziché 0?
Tuttavia, non capisco il motivo per cui accade quanto segue:.
SELECT SUM(someNotNullableIntegerField) FROM someTable WHERE 1=0
Questa query restituisce null
. Perché? Non ci sono valori sconosciuti coinvolti qui! La clausola WHERE restituisce lo zero record, e la somma di un insieme vuoto di valori è 0
. [**] Si noti che l'insieme non è sconosciuta, è noto per essere vuota.
So che posso aggirare il problema utilizzando ISNULL
o COALESCE
, ma sto cercando di capire il motivo per cui questo comportamento, che appare contro-intuitivo per me, è stato scelto.
Qualche idea sul perché questo ha senso?
[*] con alcune notevoli eccezioni, come null OR true
, dove ovviamente true
è il risultato giusto dal momento che il valore sconosciuto semplicemente non importa.
[**] proprio come il prodotto di un set di valori vuoto è 1
. Matematicamente parlando, se dovessi estendere $ (Z, +) $ a $ (Z union {null}, +) $, la scelta ovvia per l'elemento identity sarebbe ancora 0
, non null
, dal x + 0 = x
ma x + null = null
.
Forse perché si sta utilizzando un aggregato. – Kermit
Quando aggiungi nulla non ottieni 0, non ottieni nulla. –
Hai esaminato il piano di esecuzione? – Kermit