2009-06-17 17 views
48

Ho una query che conta il prezzo di tutti gli articoli tra due date. Ecco la dichiarazione scelta:Come posso modificare NULL a 0 quando si ottiene un singolo valore da una funzione SQL?

SELECT SUM(Price) AS TotalPrice 
FROM Inventory 
WHERE (DateAdded BETWEEN @StartDate AND @EndDate) 

È possibile assumere che tutte le tabelle siano state configurate correttamente.

Se faccio un prescelto tra due date e non ci sono elementi all'interno di tale intervallo di date, la funzione restituisce NULL come TotalPrice piuttosto che 0.

Come posso fare in modo che, se nessun record vengono trovati, 0 viene restituito anziché NULL?

risposta

84

maggior parte dei server di database hanno una funzione COALESCE, che restituirà il primo argomento che non è nullo, quindi il seguente dovrebbe fare quello che vuoi:

SELECT COALESCE(SUM(Price),0) AS TotalPrice 
FROM Inventory 
WHERE (DateAdded BETWEEN @StartDate AND @EndDate) 

[modifica]

Giusto per chiarire le cose poiché sembra esserci molta discussione su "COALESCE/ISNULL restituirà NULL se nessuna riga corrisponde", prova questa query che puoi copiare e incollare direttamente in SQL Server così com'è:

SELECT coalesce(SUM(column_id),0) AS TotalPrice 
FROM sys.columns 
WHERE (object_id BETWEEN -1 AND -2) 

Si noti che la clausola where esclude tutte le righe da sys.columns da considerazione, ma l'operatore 'sum' restituisce sempre una singola riga restituita null, che coalesce si risolve in una singola riga con 0.

Spero che questo aiuti a spiegarlo.

+0

Se si legge la domanda, si desidera restituire 0 se non ci sono risultati, questo funzionerà solo se il risultato della somma è nullo – Tetraneutron

+0

@Tetraneutron: Penso che funzionerà. somma (prezzo) sarà nullo se non ci sono righe, ma ci sarà sempre esattamente una riga di risultato. – Thilo

+0

COALESCE funziona bene fino a quando non si ottiene una riga per il funzionamento (cosa che si fa in questo caso). COALESCE non ti aiuterà se non ottieni nessuna riga indietro. –

12
SELECT ISNULL(SUM(Price), 0) AS TotalPrice 
FROM Inventory 
WHERE (DateAdded BETWEEN @StartDate AND @EndDate) 

Questo dovrebbe fare il trucco.

6

Edit: Sembra che tutti gli altri mi ha battuto ad esso haha ​​

trovato la risposta.

ISNULL() determina cosa fare quando si ha un valore nullo.

In questo caso, la mia funzione restituisce un valore nullo quindi è necessario specificare un 0 da restituire.

SELECT ISNULL(SUM(Price), 0) AS TotalPrice 
FROM Inventory 
WHERE (DateAdded 
BETWEEN @StartDate AND @EndDate) 
+0

isnull or coality funzionerà – BlackTigerX

+0

Credo che IFNULL sia l'equivalente di MySQL e ISNULL sia per MS 'T-SQL . – ojrac

+1

Hai la dichiarazione ISNULL all'indietro per ciò che stai cercando di fare. Penso che lo desideri invece: SUM (ISNULL (Prezzo, 0)) – JohnFx

9
SELECT 0+COALESCE(SUM(Price),0) AS TotalPrice 
FROM Inventory 
WHERE (DateAdded BETWEEN @StartDate AND @EndDate) 
+0

Questo lo farà – Tetraneutron

+0

L'ho appena testato con un tavolo vuoto e funziona RBarry ... – CodeRedick

+0

Vedere la mia risposta qui sotto. Basta usare ISNULL (o COALESCE) due volte, una per ogni riga, poi per la somma. SELEZIONA ISNULL (SUM (ISNULL (Prezzo, 0)), 0)) – dkretz

3

Si potrebbe utilizzare

SELECT ISNULL(SUM(ISNULL(Price, 0)), 0).

Sono sicuro al 99% che funzionerà.

+5

L'ISNULL interno non è necessario, poiché SUM ignorerà solo i valori NULL. – sayap

5
SELECT COALESCE(
    (SELECT SUM(Price) AS TotalPrice 
    FROM Inventory 
    WHERE (DateAdded BETWEEN @StartDate AND @EndDate)) 
    , 0) 

Se la tabella contiene righe nella risposta, restituisce SOMMA (prezzo). Se SUM è NULL o non ci sono righe, verrà restituito 0.

L'inserimento di COALESCE (SUM (Prezzo), 0) NON funziona in MSSQL se non vengono trovate righe.

+0

Ovviamente questo impedisce di ottenere più di un valore alla volta dalla tabella Inventario. – Paul

1

ORACLE/PLSQL:

NVL FUNZIONE dichiarazione

SELECT NVL(SUM(Price), 0) AS TotalPrice 
FROM Inventory 
WHERE (DateAdded BETWEEN @StartDate AND @EndDate) 

Questa SQL sarebbe tornato 0 se il SUM(Price) restituito un valore nullo. In caso contrario, restituirebbe il valore SUM(Price).

-5

Il modo più semplice per eseguire questa operazione è aggiungere zero al risultato.

cioè

$A=($row['SUM'Price']+0); 
echo $A; 

speranza che questo aiuta !!

+1

Questo potrebbe funzionare se l'argomento starter ha un codice PHP per interpretare i risultati, ma se la domanda è limitata a SQL, questo non funzionerà come risposta. – Vesper

Problemi correlati