Geben Sie 0 zurück, wenn das Feld in MySQL null ist

160

Gibt es in MySQL eine Möglichkeit, die "Gesamt" -Felder auf Null zu setzen, wenn sie NULL sind?

Folgendes habe ich:

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 kommen gut heraus, außer die NULL-Felder sollten sein 0.

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

Kevin
quelle

Antworten:

326

Verwenden Sie IFNULL :

IFNULL(expr1, 0)

Aus der Dokumentation:

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

Mark Byers
quelle
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.
Mark Byers
2
@ MarkByers kannst du zeigen, warum Kevins Beispiel im Kommentar falsch ist und was es eigentlich sein sollte?
Michael
ich danke dir sehr !! Dies ist genau das, wonach ich gesucht habe
Brunobliss
@ MarkByers IFNOtNULL (Ausdruck1, 1) gibt es so etwas
Noni
25

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

Ich sollte erwähnen, dass solche Funktionen pro Zeile normalerweise für die Skalierbarkeit problematisch sind. Wenn Sie der Meinung sind, dass Ihre Datenbank eine anständige Größe hat, ist es oft besser, zusätzliche Spalten und Trigger zu verwenden, um die Kosten von der selectauf die zu verschieben insert/update.

Dadurch werden die Kosten amortisiert, vorausgesetzt, Ihre Datenbank wird häufiger gelesen als geschrieben (und die meisten von ihnen sind es).

paxdiablo
quelle
Dies geschieht einmal pro Woche, um alle Kunden in Rechnung zu stellen. Die Daten werden die ganze Woche geschrieben und dann zu einem bestimmten Zeitpunkt berechnet und in Rechnung gestellt. Stellen Sie sich das wie einen Abonnementdienst vor. Sie können während der Laufzeit des Abrechnungszeitraums Änderungen vornehmen, und Ihre Aktivität wird in angemessenen Abständen in Rechnung gestellt.
Kevin
Ich würde hinzufügen, dass ich in dieser Situation das Zusammenführen vorziehen würde, da es die gleiche Syntax für MS und My SQLs gibt, während MS SQL iSnull und MySQL iFnull ist, wenn dies für jemanden von Bedeutung ist. (MySQLs ISNULL ist eine andere Funktion als MS SQLs ISNULL)
Craig Jacobs
11

Keine der obigen Antworten war für mich vollständig. Wenn Ihr Feld benannt ist field, sollte der Selektor der folgende sein:

IFNULL(`field`,0) AS field

Zum Beispiel in einer SELECT-Abfrage:

SELECT IFNULL(`field`,0) AS field, `otherfield` FROM `mytable`

Hoffe, dies kann jemandem helfen, keine Zeit zu verschwenden.

Gianpaolo Papa
quelle
5

Sie können so etwas versuchen

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

Das Attribut X wird als leer angenommen, wenn es sich um eine leere Zeichenfolge handelt. Danach können Sie anstelle des letzten Werts eine Null deklarieren. In einem anderen Fall würde es seinen ursprünglichen Wert behalten.

Wie auch immer, nur um einen anderen Weg zu finden, das zu tun.

ackuser
quelle
Dies funktionierte für mich großartig in der Mitte eines SELECT gegen den normalen IFNULL (var, 0)
Ajankuv
5

Ja, die IFNULL-Funktion arbeitet, 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;
Krishna_K_Systematix
quelle