Quale dei seguenti è corretta?Differenza tra ISNULL (SUM (x), 0) o SUM (ISNULL (x, 0) in SQL Server
SUM(ISNULL(Sales,0)) AS Sales,
ISNULL(SUM(Sales),0) AS Sales,
o sono entrambe corrette?
Quale dei seguenti è corretta?Differenza tra ISNULL (SUM (x), 0) o SUM (ISNULL (x, 0) in SQL Server
SUM(ISNULL(Sales,0)) AS Sales,
ISNULL(SUM(Sales),0) AS Sales,
o sono entrambe corrette?
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.
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
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.
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
nice @martinsmith –
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
@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. –