2012-10-04 17 views
10

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.

+0

Forse perché si sta utilizzando un aggregato. – Kermit

+0

Quando aggiungi nulla non ottieni 0, non ottieni nulla. –

+0

Hai esaminato il piano di esecuzione? – Kermit

risposta

9

Lo standard ANSI-SQL definisce il risultato di SUM di un set vuoto come NULL. Perché hanno fatto questo, non posso dirlo, ma almeno il comportamento dovrebbe essere coerente in tutti i motori di database.

Riferimento: http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt a pagina 126:

b) Se AVG, MAX, MIN, o SUM è specificato, quindi

  Case: 

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

TXA è del risultato operativo dalla colonna selezionata .

+0

Penso che questo sia per coerenza, poiché l'unico valore ragionevole per 'AVG',' MIN', 'MAX', quindi suppongo che abbiano deciso di non rendere' SUM' un caso speciale. L'unico caso speciale è 'COUNT'. Peccato che lo standard non includa il razionale dietro di esso. –

+1

Ho iniziato [una domanda su dba.stackexchange.com] (http://dba.stackexchange.com/q/25435/5273) su * perché * è stata supportata in questo modo. – Heinzi

0

Quando si intende tabella vuota si intende una tabella con solo valori NULL, Ecco perché otterremo NULL come output per le funzioni di aggregazione. È possibile considerarlo come di progettazione per SQL Server.

Esempio 1

CREATE TABLE testSUMNulls 
(
    ID TINYINT 
) 
GO 

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

SELECT SUM(ID) FROM testSUMNulls 

Esempio 2

CREATE TABLE testSumEmptyTable 
(
    ID TINYINT 
) 
GO 

SELECT SUM(ID) Sums FROM testSumEmptyTable 

In entrambi gli esempi si vuole NULL come output ..

+2

'Quando si intende una tabella vuota si intende una tabella con solo valori NULL,' ... no, decisamente no. – Heinzi

Problemi correlati