2009-06-17 10 views
48

Mam zapytanie, które zawiera cenę wszystkich produktów między dwiema datami. Oto instrukcja select:Jak zmienić wartość NULL na 0 podczas pobierania pojedynczej wartości z funkcji SQL?

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

Można założyć, że wszystkie tabele zostały poprawnie skonfigurowane.

Gdybym zrobić wybierać między dwiema datami i nie ma żadnych przedmiotów w tym przedziale czasowym, funkcja zwraca NULL jako TotalPrice zamiast 0.

Jak mogę mieć pewność, że jeśli nie znajdują się zapisy, 0 zostanie zwrócone zamiast NULL?

Odpowiedz

84

Większość serwerów baz danych mają COALESCE funkcję, która będzie zwracać pierwszy argument, który jest niezerowe, więc następujące powinien zrobić to, co chcesz:

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

[edytuj]

Właśnie w celu wyjaśnienia rzeczy, ponieważ wydaje się, że jest dużo dyskusji na temat "COALESCE/ISNULL będzie nadal zwracać NULL, jeśli nie pasują wiersze", spróbuj tego zapytania można skopiować i wkleić do SQL Server bezpośrednio, jak jest:

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

Należy zwrócić uwagę, że klauzula where wyklucza uwzględnienie wszystkich wierszy z kolumny sys.columns, ale operator "suma" powoduje, że zwracany jest jeden wiersz o wartości NULL, który powoduje, że poprawki są pojedynczym wierszem o wartości 0.

Mam nadzieję, że pomoże to wyjaśnić.

+0

Jeśli przeczytasz pytanie, które chce, aby 0 zostało zwrócone, jeśli nie było żadnych wyników, zadziała to tylko wtedy, gdy wynik sumy jest zerowy – Tetraneutron

+0

@Tetraneutron: Myślę, że to zadziała. suma (cena) będzie null, jeśli nie ma żadnych wierszy, ale zawsze będzie dokładnie jeden wiersz wyników. – Thilo

+0

COALESCE działa dobrze, dopóki masz ustawiony rząd, z którego będzie działać (co robisz w tym przypadku). COALESCE nie pomoże, jeśli nie otrzymasz żadnych wierszy. –

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

To powinno załatwić sprawę.

6

Edit: Wygląda jak każdy inny pokazał mi z nim haha ​​

znalazłem odpowiedź.

ISNULL() określa, co zrobić, gdy masz wartość pustą.

W tym przypadku moja funkcja zwraca wartość pustą, więc musiałem podać wartość 0, która ma zostać zwrócona.

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

isnull lub coalesce będzie pracować – BlackTigerX

+0

Wierzę, że IFNULL jest odpowiednikiem MySQL, a ISNULL jest dla MS-T-SQL . – ojrac

+1

Otrzymujesz ISNULL od tyłu za to, co próbujesz zrobić. Myślę, że chcesz tego zamiast: SUMA (ISNULL (Cena, 0)) – JohnFx

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

To zrobi to – Tetraneutron

+0

Właśnie przetestowałem to z pustym stołem i działa RBarry ... – CodeRedick

+0

Zobacz moją odpowiedź poniżej. Wystarczy użyć ISNULL (lub COALESCE) dwa razy, raz dla każdego wiersza, a następnie dla sumy. SELECT ISNULL (SUMA (ISNULL (Cena, 0)), 0)) – dkretz

3

Można użyć

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

Jestem w 99% pewien, że zadziała.

+5

Wewnętrzny ISNULL nie jest potrzebny, ponieważ SUMA po prostu zignoruje wartości NULL. – sayap

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

Jeśli tabela zawiera wiersze w odpowiedzi, zwraca wartość SUM (cena). Jeśli SUMA ma wartość NULL lub nie ma wierszy, zwróci 0.

Umieszczenie COALESCE (SUMA (cena), 0) NIE działa w MSSQL, jeśli nie znaleziono żadnych wierszy.

+0

Oczywiście uniemożliwia to uzyskanie więcej niż jednej wartości naraz z tabeli magazynu. – Paul

1

Oracle/PLSQL:

NVL FUNKCJI oświadczenie

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

To SQL wróci 0 jeśli SUM(Price) powrócił wartość null. W przeciwnym razie zwraca wartość SUM(Price).

-5

Najprostszym sposobem na zrobienie tego jest dodanie zerowego wyniku.

tj

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

nadzieję, że to pomoże !!

+1

Może to działać, jeśli rozrusznik tematu ma kod PHP interpretujący wyniki, ale jeśli pytanie jest ograniczone do SQL, nie będzie to stanowiło odpowiedzi. – Vesper

Powiązane problemy