Restituisce 0 se il campo è null in MySQL


160

In MySQL, c'è un modo per impostare i campi "totali" su zero se sono NULL?

Ecco cosa ho:

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;

I dati vengono forniti correttamente, ad eccezione dei campi NULL 0.

Come posso restituire 0 per NULL in MySQL?

Risposte:


327

Usa IFNULL :

IFNULL(expr1, 0)

Dalla documentazione:

Se expr1 non è NULL, IFNULL () restituisce expr1; altrimenti restituisce expr2. IFNULL () restituisce un valore numerico o stringa, a seconda del contesto in cui viene utilizzato.


Sarebbe IFNULL ((SELECT SUM (uop.price * uop.qty) FROM uc_order_products uop DOVE uo.order_id = uop.order_id) AS products_subtotal, 0)?
Kevin,

2
@Kevin: No - l'alias va alla fine.
Mark Byers,

2
@MarkByers puoi mostrare perché l'esempio di Kevin nel commento è sbagliato e quale dovrebbe essere?
Michael,

grazie mille !! Questo è esattamente quello che stavo cercando
brunobliss il

@MarkByers IFNOtNULL (expr1, 1) c'è qualcosa del genere
Noni

25

Puoi usare coalesce(column_name,0)invece di solo column_name. La coalescefunzione restituisce il primo valore non NULL nell'elenco.

Vorrei menzionare che funzioni per riga come questa di solito sono problematiche per la scalabilità. Se ritieni che il tuo database possa avere dimensioni decenti, è spesso meglio utilizzare colonne e trigger aggiuntivi per spostare i costi da selecta insert/update.

Ciò ammortizza il costo presupponendo che il database venga letto più spesso di quanto scritto (e la maggior parte di essi lo è).


Questo accade una volta alla settimana per fatturare tutti i clienti. I dati vengono scritti per tutta la settimana, quindi a una certa ora, calcolati e fatturati. Pensalo come un servizio in abbonamento. Puoi apportare modifiche durante il periodo di fatturazione e la tua attività viene addebitata a intervalli appropriati.
Kevin,

Vorrei aggiungere che in questa situazione preferirei la coalescenza perché è la stessa sintassi per MS e My SQLs, mentre MS SQL è iSnull e MySQL è iFnull, se questo è importante per chiunque. (MySQL ISNULL è una funzione diversa rispetto a MS SQL ISNULL)
Craig Jacobs

11

Nessuna delle risposte di cui sopra era completa per me. Se il tuo campo è chiamato field, quindi il selettore dovrebbe essere il seguente:

IFNULL(`field`,0) AS field

Ad esempio in una query SELECT:

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

Spero che questo possa aiutare qualcuno a non perdere tempo.


5

Puoi provare qualcosa del genere

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

Si presume che l'attributo X sia vuoto se si tratta di una stringa vuota, quindi in seguito è possibile dichiarare come zero anziché l'ultimo valore. In un altro caso, rimarrebbe il suo valore originale.

Comunque, solo per dare un altro modo per farlo.


Questo ha funzionato per me alla grande nel mezzo di una SELECT contro il normale IFNULL (var, 0)
ajankuv,

5

Sì La funzione IFNULL funzionerà per ottenere il risultato desiderato.

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;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.