2012-10-04 37 views
10

entiendo por quénull + 1 o (1 + null) devuelve null: null significa "valor desconocido", y si un valor es desconocido, su sucesor es desconocida también. Lo mismo es cierto para la mayoría de las otras operaciones que implican nula [*]¿Por qué SUM (...) en un conjunto de registros vacío devuelve NULL en lugar de 0?

Sin embargo, yo no entiendo por qué ocurre lo siguiente:.

SELECT SUM(someNotNullableIntegerField) FROM someTable WHERE 1=0 

Esta consulta devuelve null. ¿Por qué? ¡Aquí no hay valores desconocidos! La cláusula WHERE devuelve cero registros, y la suma de un conjunto vacío de valores es 0. [**] Tenga en cuenta que el conjunto no es desconocida , es conocido por ser vacío.

sé que puedo evitar este comportamiento mediante el uso ISNULL o COALESCE, pero estoy tratando de entender por qué este comportamiento, que parece contrario a la intuición para mí, fue elegido.

¿Alguna idea de por qué esto tiene sentido?


[*] con algunas excepciones notables, como null OR true, donde obviamente true es el resultado correcto ya que el valor desconocido, simplemente no importa.

[**] al igual que el producto de un conjunto de valores vacío es 1. Matemáticamente hablando, si tuviera que extender $ (Z, +) $ a $ (Z union {null}, +) $, la opción obvia para el elemento de identidad sería 0, no null, ya que x + 0 = x pero x + null = null.

+0

Quizás porque está utilizando un agregado. – Kermit

+0

Cuando no agrega nada, no obtiene 0, no obtiene nada. –

+0

¿Has mirado el plan de ejecución? – Kermit

Respuesta

9

El estándar ANSI-SQL define el resultado de la SUMA de un conjunto vacío como NULL. Por qué lo hicieron, no puedo decirlo, pero al menos el comportamiento debería ser coherente en todos los motores de base de datos.

Referencia: http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt en la página 126:

b) Si AVG, MAX, MIN, o se especifica SUM, entonces

  Case: 

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

TXA es el conjunto de resultados operativa de la columna seleccionada .

+0

Creo que esto es por coherencia, ya que es el único valor razonable para 'AVG',' MIN', 'MAX', así que supongo que decidieron no convertir' SUM' en un caso especial. El único caso especial es 'COUNT'. Es una pena que el estándar no incluya el racional detrás de él. –

+1

Comencé [una pregunta en dba.stackexchange.com] (http://dba.stackexchange.com/q/25435/5273) sobre * por qué * estaba estandarizado de esta manera. – Heinzi

0

Cuando te refieres a la tabla vacía te refieres a una tabla con solo NULL valores, es por eso que obtendremos NULL como salida para funciones agregadas. Puede considerar esto como por diseño para SQL Server.

Ejemplo 1

CREATE TABLE testSUMNulls 
(
    ID TINYINT 
) 
GO 

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

SELECT SUM(ID) FROM testSUMNulls 

Ejemplo 2

CREATE TABLE testSumEmptyTable 
(
    ID TINYINT 
) 
GO 

SELECT SUM(ID) Sums FROM testSumEmptyTable 

En los dos ejemplos podrá NULL como salida ..

+2

'Cuando te refieres a la tabla vacía te refieres a una tabla con solo valores NULL,' ... no, definitivamente no. – Heinzi

Cuestiones relacionadas