Welche der folgenden Aussagen ist richtig?Unterschied zwischen ISNULL (SUM (x), 0) OR SUM (ISNULL (x, 0) in SQL Server
SUM(ISNULL(Sales,0)) AS Sales,
ISNULL(SUM(Sales),0) AS Sales,
Oder sind sie beide richtig?
Welche der folgenden Aussagen ist richtig?Unterschied zwischen ISNULL (SUM (x), 0) OR SUM (ISNULL (x, 0) in SQL Server
SUM(ISNULL(Sales,0)) AS Sales,
ISNULL(SUM(Sales),0) AS Sales,
Oder sind sie beide richtig?
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.
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
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.
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
nice @martinsmith –
Ü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
@ 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. –