如果MySQL中的字段为null,则返回0


160

在MySQL中,是否有一种方法可以将“总计”字段设置为零(如果它们为NULL)?

这是我所拥有的:

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字段应为0

如何在MySQL中为NULL返回0?

Answers:


326

使用IFNULL

IFNULL(expr1, 0)

从文档中:

如果expr1不为NULL,则IFNULL()返回expr1; 否则返回expr2。IFNULL()返回数字或字符串值,具体取决于使用它的上下文。


是IFNULL((SELECT SUM(uop.price * uop.qty)FROM uc_order_products uop WHERE uo.order_id = uop.order_id)AS products_subtotal,0)吗?
凯文(Kevin)2010年

2
@Kevin:否-别名结尾。
马克·拜尔斯

2
@MarkByers您可以说明为什么凯文评论中的示例是错误的,以及实际上应该是什么?
迈克尔

非常感谢 !!这正是我一直在寻找的东西
brunobliss 2016年

@MarkByers IFNOtNULL(expr1,1)是否有类似的内容
Noni,

25

您可以使用coalesce(column_name,0)而不是column_name。的coalesce函数返回列表中的第一个非NULL值。

我应该提到这样的每行函数通常在可伸缩性方面存在问题。如果您认为数据库的大小可能合适,通常最好使用额外的列和触发器将成本从select转移到。insert/update

假设数据库的读取频率比写入的频率高(大多数都是),则这将摊销成本。


每周发生一次,向所有客户收费。整个星期都会写入数据,然后在某个时间对其进行计算和计费。将其视为订阅服务。您可以在结算期间进行更改,并且您的活动会按适当的时间间隔收费。
凯文(Kevin)2010年

我要补充一点,在这种情况下,我更喜欢合并,因为它与MS和My SQL的语法相同,而MS SQL是iSnull,而MySQL是iFnull(如果对任何人都重要)。(MySQL的ISNULL与MS SQL的ISNULL是不同的函数)
Craig Jacobs

11

以上答案对我来说都不完整。如果您的字段名为field,那么选择器应为以下之一:

IFNULL(`field`,0) AS field

例如在SELECT查询中:

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

希望这可以帮助某人不要浪费时间。


5

您可以尝试这样的事情

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

如果属性X为空字符串,则假定它为空,因此之后可以声明为零而不是最后一个值。在另一种情况下,它将保持其原始值。

无论如何,只是给出另一种方式来做到这一点。


在SELECT与常规IFNULL(var,0)中间,这对我非常有用
ajankuv

5

是的IFNULL函数将起作用以达到您想要的结果。

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;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.