MySQL'de alan boşsa 0 döndür


160

MySQL, NULL ise "toplam" alanları sıfıra ayarlamak için bir yolu var mı?

İşte ne var:

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;

NULL alanları olması dışında veriler iyi çıkıyor 0.

MySQL'de NULL için 0'ı nasıl döndürebilirim?

Yanıtlar:


327

IFNULL kullanın :

IFNULL(expr1, 0)

Belgelerden:

İfade1 NULL değilse, EĞER () ifade1 döndürür; aksi takdirde ifade2 döndürür. IFNULL (), kullanıldığı bağlama bağlı olarak sayısal veya dize değeri döndürür.


IFNULL ((SELECT SUM (uop.price * uop.qty) uc_order_products uop NEREDEN uo.order_id = uop.order_id) AS products_subtotal, 0) olur mu?
Kevin

2
@Kevin: Hayır - takma ad sona erer.
Mark Byers

2
@ MarkByers, Kevin'in yorumdaki örneğinin neden yanlış olduğunu ve aslında ne olması gerektiğini gösterebilir misiniz?
Michael

çok teşekkür ederim !! Bu tam olarak aradığım şey
brunobliss

@MarkByers IFNOtNULL (ifade1, 1) böyle bir şey var
Noni

25

Sadece coalesce(column_name,0)yerine kullanabilirsiniz column_name. coalesceFonksiyon Listedeki ilk boş olmayan bir değer verir.

Bu gibi satır başına işlevlerin ölçeklenebilirlik için genellikle sorunlu olduğunu belirtmeliyim. Eğer veritabanı iyi bir boyutu olarak alabilirsiniz düşünüyorsanız, gelen maliyetini taşımak için ekstra sütunları ve tetikleyicileri kullanılması genellikle daha iyidir selectiçin insert/update.

Bu, veritabanınızın yazıldığından (ve çoğu) daha sık okunduğunu varsayarak maliyeti düşürür.


Bu, tüm müşterileri faturalandırmak için haftada bir kez olur. Veriler tüm hafta yazılır, daha sonra belirli bir zamanda hesaplanır ve faturalanır. Bunu bir abonelik hizmeti gibi düşünün. Faturalandırma süresi boyunca değişiklik yapabilirsiniz ve etkinliğiniz uygun aralıklarla ücretlendirilir.
Kevin

Bu durumda, MS ve My SQL'ler için aynı sözdizimi olmasına rağmen, MS SQL iSnull ve MySQL iFnull ise, herkes için önemliyse, bunu tercih edeceğimizi ekleyeceğim. (MySQLs ISNULL, MS SQL ISNULL'dan farklı bir işlevdir)
Craig Jacobs

11

Yukarıdaki cevapların hiçbiri benim için tam değildi. Alanınız adlandırılmışsa field, seçici şu şekilde olmalıdır:

IFNULL(`field`,0) AS field

Örneğin bir SELECT sorgusunda:

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

Bu birinin zaman kaybetmemesine yardımcı olabileceğini umuyoruz.


5

Böyle bir şey deneyebilirsin

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

X özelliğinin boş bir Dize olması durumunda boş olduğu varsayılır, bundan sonra son değer yerine sıfır olarak bildirebilirsiniz. Başka bir durumda, orijinal değeri olarak kalacaktır.

Her neyse, bunu yapmanın başka bir yolunu vermek için.


Bu bir SELECT ortasında normal IFNULL (var, 0) ortasında benim için harika çalıştı (var, 0)
ajankuv

5

Evet IFNULL işlevi istediğiniz sonucu elde etmek için çalışacaktır.

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;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.