2010-10-22 19 views
104

Gibt es in MySQL eine Möglichkeit, die "totalen" Felder auf Null zu setzen, wenn sie NULL sind? HierGibt 0 zurück, wenn das Feld in MySQL null ist

ist, was ich habe:

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; 

Die Daten stammen aus feinen, mit Ausnahme der NULL-Felder 0 sein sollte.

Wie kann ich 0 für NULL in MySQL zurückgeben?

Antwort

213

Verwendung IFNULL:

IFNULL(expr1, 0) 

Aus der Dokumentation:

Wenn expr1 nicht NULL ist, IFNULL() gibt expr1; Andernfalls wird expr2 zurückgegeben. IFNULL() gibt einen numerischen Wert oder einen Zeichenfolgenwert zurück, abhängig vom Kontext, in dem es verwendet wird.

+0

Wäre das IFNULL ((SELECT SUM (uop.price * uop.qty) FROM uc_order_products UOP WHERE uo.order_id = uop.order_id) AS products_subtotal, 0)? – Kevin

+2

@Kevin: Nein - der Alias ​​geht am Ende. –

+1

Gotcha. Das funktioniert! Vielen Dank. – Kevin

20

Sie können coalesce(column_name,0) anstatt nur column_name verwenden. Die Funktion coalesce gibt den ersten Nicht-NULL-Wert in der Liste zurück.

Ich sollte erwähnen, dass pro Zeile Funktionen wie diese in der Regel problematisch für die Skalierbarkeit sind. Wenn Sie glauben, dass Ihre Datenbank eine anständige Größe haben kann, ist es oft besser, zusätzliche Spalten und Trigger zu verwenden, um die Kosten von select auf insert/update zu verschieben.

Dies amortisiert die Kosten unter der Annahme, dass Ihre Datenbank öfter gelesen wird als geschrieben (und die meisten von ihnen sind).

+0

Dies geschieht einmal pro Woche, um alle Kunden in Rechnung zu stellen. Daten werden die ganze Woche geschrieben, dann zu einer bestimmten Zeit, berechnet und berechnet. Stellen Sie sich das wie einen Abo-Service vor. Sie können während der Dauer des Abrechnungszeitraums Änderungen vornehmen, und Ihre Aktivität wird in angemessenen Abständen in Rechnung gestellt. – Kevin

+0

Ich würde hinzufügen, dass in dieser Situation, die ich lieber zusammenwachsen würde, weil es die gleiche Syntax für MS und My SQLs ist, während MS SQL iSnull und MySQL iFnull ist, wenn das für jeden von Bedeutung ist. (MySQL ISNULL ist eine andere Funktion als ISNULL von MS SQL) –

3

Sie können so etwas wie dieses

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

Attribut versuchen X leer sein werden angenommen, wenn es ein leerer String ist, so nach, dass Sie als Null statt letzten Wert erklären können. In einem anderen Fall würde es seinen ursprünglichen Wert behalten.

Wie auch immer, nur um einen anderen Weg zu geben, dies zu tun.

+0

Das funktionierte für mich großartig in der Mitte eines SELECT vs dem normalen IFNULL (var, 0) – ajankuv

2

Ja IFNULL-Funktion wird arbeiten, um das gewünschte Ergebnis zu erzielen.

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

Ich würde vorschlagen, dass Sie ein Codebeispiel hinzufügen, und nicht nur einen Link. Links können veralten oder sich ändern. –

+0

Danke Herr Positiv. –

+0

Ich habe meine Antwort aktualisiert und Antwort mit vollständigen Details hinzugefügt. –

Verwandte Themen