2013-05-01 18 views

Antwort

15

beide geben das gleiche, außer wenn Sie eine Abfrage auf einem leeren Ergebnismenge ausgeführt werden.

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 

Die SUM(ISNULL(Sales,0)) Version würde die ANSI WARNUNGEN über die Aggregation NULL vermeiden.

Ein weiterer feiner Unterschied ist, dass der Datentyp der Ergebnisspalte ISNULL(SUM(Sales),0) nicht als nullbar gilt.

+0

nice @martinsmith –

+0

Über die Verwendung des Wortes S Ales? MIT Sales_CTE (SalesAndNulls) AS ( SELECT 1 UNION SELECT NULL ) SUM SELECT (ISNULL (SalesAndNulls, 0)) als Umsatz1, ISNULL (SUM (SalesAndNulls), 0) als Sales2 FROM Sales_CTE Sie erhalten dieses Ergebnis mit einer Warnung ... Sales1 = 1 Sales2 = 1 Warnung: Nullwert wird durch ein Aggregat oder eine andere SET-Operation eliminiert. (1 Zeile (n) betroffen) – Alborz

+0

@ Alborz - Ja, das ist die ANSI-Warnung aus der 'Sales2'-Version. Du könntest 'ISNULL (SUM (ISNULL (SalesAndNulls, 0)), 0) AS Sales3' tun, wenn du '0' auf eine leere Ergebnismenge zurückgeben und keine Warnungen sehen willst. –

2

Der erste sagt

SUM jedes Verkaufs Feld, und wenn das Feld NULL ist, behandeln es als Null.

Der zweite sagt Summe der Verkaufs Feld, und wenn die Gesamt NULL ist, berichten über eine Null statt ...

jedoch die SUM() Befehl NULL überspringt (obwohl man darüber gewarnt werden) , so dass der erste wird nicht bewirken, dass die Fehlermeldung

3

Versuchen Sie, diese bekommen:

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 

Sie werden 21 erhalten, 21, 0 und NULL. Wenn Sie keine Nullen behandeln wollen, ist ISNULL (SUM (X), 0) der richtige Weg.

1

Es gibt einen Unterschied ja. Wenn ich mich nicht täusche

5 + NULL = NULL 

so der erste Fall

SUM(ISNULL(Sales,0)) AS Sales 

würde den Nullwert auf 0 ändern und sie dann Summe, die 5
während der zweite Fall zurückkehren würde

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

Würde Null in denselben Daten zurückgeben