2013-05-01 17 views

risposta

15

entrambi restituiscono lo stesso, tranne se si esegue una query su un set di risultati vuoto.

WITH Sales(Sales) AS 
(
SELECT 1 
) 
SELECT 
     SUM(ISNULL(Sales,0)) AS Sales, 
     ISNULL(SUM(Sales),0) AS Sales 
FROM  Sales  
WHERE 1=0 

Returns

Sales  Sales 
----------- ----------- 
NULL  0 

La versione SUM(ISNULL(Sales,0)) eviterebbe gli AVVISI ANSI sull'aggregazione di NULL.

Un'altra piccola differenza è che il tipo di dati della colonna dei risultati di ISNULL(SUM(Sales),0) non è considerato nullable.

+0

nice @martinsmith –

+0

Oltre l'uso della parola S Ales? CON Sales_CTE (SalesAndNulls) AS ( SELECT 1 UNION SELEZIONA NULL ) SELEZIONARE SUM (ISNULL (SalesAndNulls, 0)) AS Sales1, isnull (SUM (SalesAndNulls), 0) AS Sales2 DA Sales_CTE Si ottiene questo risultato con un avviso ... Vendite1 = 1 Vendite2 = 1 Avviso: il valore nullo viene eliminato da un'operazione di aggregazione o di altro tipo. (1 riga (e) interessata) – Alborz

+0

@Alborz - Sì, questo è l'ANSI WARNING dalla versione 'Sales2'. Si potrebbe fare 'ISNULL (SUM (ISNULL (SalesAndNulls, 0)), 0) AS Sales3' se si desidera restituire' 0' su un set di risultati vuoto e non vedere alcun avviso. –

2

Il primo dice

SUM ogni campo Vendite, e se il campo è NULL, trattarlo come zero.

Il secondo dice Somma il campo delle vendite, e se il totale è NULL, segnalare uno zero invece ...

Tuttavia, il comando SOMMA() salta NULL (anche se si viene avvisati su di esso) , quindi il primo farà sì che non per ottenere il messaggio di errore

3

Prova questa:

DECLARE @table TABLE 
(
    id INT IDENTITY, 
    Alborz INT 
) 
INSERT INTO @table 
     SELECT 1 
     UNION ALL 
     SELECT 1 
     UNION ALL 
     SELECT 1 
     UNION ALL 
     SELECT 1 
     UNION ALL 
     SELECT 1 
     UNION ALL 
     SELECT NULL 

SELECT ISNULL(SUM(Alborz), 0) 
FROM @table 
SELECT SUM(ISNULL(Alborz, 0)) 
FROM @table 

DELETE FROM @table 

SELECT ISNULL(SUM(Alborz), 0) 
FROM @table 
SELECT SUM(ISNULL(Alborz, 0)) 
FROM @table 

otterrete 21, 21, 0, e NULL. Se non vuoi gestire null, allora ISNULL (SUM (X), 0) è la strada da percorrere.

1

C'è una differenza sì. Se non mi sbaglio

5 + NULL = NULL 

in modo che il primo caso

SUM(ISNULL(Sales,0)) AS Sales 

cambierebbe il valore null a 0 e poi riassumere loro quale sarebbe tornato 5
mentre il secondo caso

ISNULL(SUM(Sales),0) AS Sales, 

Restituire null negli stessi dati