2010-10-22 10 views
104

Czy w MySQL istnieje możliwość ustawienia pól "total" na zero, jeśli są one NULL?Powrót 0, jeśli pole jest puste w MySQL

Oto co mam:

SELECT uo.order_id, uo.order_total, uo.order_status, 
      (SELECT SUM(uop.price * uop.qty) 
      FROM uc_order_products uop 
      WHERE uo.order_id = uop.order_id 
      ) AS products_subtotal, 
      (SELECT SUM(upr.amount) 
      FROM uc_payment_receipts upr 
      WHERE uo.order_id = upr.order_id 
      ) AS payment_received, 
      (SELECT SUM(uoli.amount) 
      FROM uc_order_line_items uoli 
      WHERE uo.order_id = uoli.order_id 
      ) AS line_item_subtotal 
      FROM uc_orders uo 
      WHERE uo.order_status NOT IN ("future", "canceled") 
      AND uo.uid = 4172; 

Dane wychodzi dobrze, z wyjątkiem zerowego pola powinny być 0.

Jak mogę zwrócić 0 dla NULL w MySQL?

Odpowiedz

213

Zastosowanie IFNULL:

IFNULL(expr1, 0) 

Z dokumentacji:

Jeśli wyr1 nie jest NULL, IFNULL() zwraca wyrażenie wyrażenie1; w przeciwnym wypadku zwraca wyrażenie2. Funkcja IFNULL() zwraca wartość liczbową lub łańcuchową, w zależności od kontekstu, w którym jest używana.

+0

byłoby to IFNULL ((SELECT SUM (uop.price * uop.qty) FROM uc_order_products UOP GDZIE uo.order_id = uop.order_id) AS products_subtotal, 0)? – Kevin

+2

@Kevin: Nie - alias idzie na końcu. –

+1

Gotcha. To działa! Dzięki. – Kevin

20

Możesz użyć coalesce(column_name,0) zamiast tylko column_name. Funkcja coalesce zwraca pierwszą wartość o wartości innej niż NULL na liście.

Należy wspomnieć, że funkcje w tym wierszu są zwykle problematyczne ze względu na skalowalność. Jeśli uważasz, że twoja baza danych może osiągnąć przyzwoity rozmiar, często lepiej użyć dodatkowych kolumn i reguł, aby przenieść koszt z select na insert/update.

Spłaca to koszt przy założeniu, że twoja baza danych jest czytana częściej niż pisemnie (a większość z nich jest).

+0

Zdarza się to raz w tygodniu, aby wystawić rachunek wszystkim klientom. Dane są zapisywane przez cały tydzień, a następnie w określonym czasie, a następnie obliczane i rozliczane. Pomyśl o tym jak o subskrypcji. Możesz wprowadzać zmiany w okresie obowiązywania okresu rozliczeniowego, a twoja działalność jest pobierana w odpowiednich odstępach czasu. – Kevin

+0

Dodałbym, że w tej sytuacji wolałbym koalesce, ponieważ jest to ta sama składnia dla MS i My SQL, podczas gdy MS SQL to iSnull, a MySQL to iFnull, jeśli ma to znaczenie dla każdego. (ISSQLs ISNULL jest inną funkcją niż ISNULL MS SQL) –

3

Można spróbować coś takiego

IFNULL(NULLIF(X, ''), 0) 

atrybutów X zakłada się być pusta, jeśli jest pusty ciąg znaków, więc po tym można zadeklarować jako zera zamiast ostatniej wartości. W innym przypadku pozostanie to jego pierwotna wartość.

W każdym razie, po prostu daj inny sposób, aby to zrobić.

+0

To działało dla mnie świetnie w środku SELECT w porównaniu do normalnego IFNULL (var, 0) – ajankuv

2

Tak Funkcja IFNULL będzie działać, aby osiągnąć pożądany rezultat.

SELECT uo.order_id, uo.order_total, uo.order_status, 
     (SELECT IFNULL(SUM(uop.price * uop.qty),0) 
     FROM uc_order_products uop 
     WHERE uo.order_id = uop.order_id 
     ) AS products_subtotal, 
     (SELECT IFNULL(SUM(upr.amount),0) 
     FROM uc_payment_receipts upr 
     WHERE uo.order_id = upr.order_id 
     ) AS payment_received, 
     (SELECT IFNULL(SUM(uoli.amount),0) 
     FROM uc_order_line_items uoli 
     WHERE uo.order_id = uoli.order_id 
     ) AS line_item_subtotal 
     FROM uc_orders uo 
     WHERE uo.order_status NOT IN ("future", "canceled") 
     AND uo.uid = 4172; 
+0

Sugerowałbym dodanie próbki kodu, a nie tylko linku. Łącza mogą stać się przestarzałe lub ulec zmianie. –

+0

Dzięki Mister Positive. –

+0

Zaktualizowałem moją odpowiedź i dodałem odpowiedź z pełnymi szczegółami. –

Powiązane problemy