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

Kev*_*vin 140 mysql sql

在MySQL中,如果它们是NULL,有没有办法将"total"字段设置为零?

这是我有的:

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;
Run Code Online (Sandbox Code Playgroud)

数据很好,除了NULL字段应该是0.

如何在MySQL中为NULL返回0?

Mar*_*ers 290

使用IFNULL:

IFNULL(expr1, 0)
Run Code Online (Sandbox Code Playgroud)

从文档:

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

  • @Kevin:不 - 别名在最后. (2认同)
  • @MarkByers你能说明为什么凯文在评论中的例子是错误的,它应该是什么? (2认同)

pax*_*blo 25

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

我应该提一下,像这样的每行函数通常会对可伸缩性产生影响.如果您认为您的数据库可能是一个合适的大小,通常最好使用额外的列和触发器将成本从中移动selectinsert/update.

假设您的数据库读取的频率高于写入(并且大部分都是),这会降低成本.


Gia*_*apa 10

以上所有答案都不适合我.如果您的字段已命名field,则选择器应为以下选项:

IFNULL(`field`,0) AS field
Run Code Online (Sandbox Code Playgroud)

例如,在SELECT查询中:

SELECT IFNULL(`field`,0) AS field, `otherfield` FROM `mytable`
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助别人不浪费时间.


ack*_*ser 5

你可以试试这样的

IFNULL(NULLIF(X, '' ), 0)
Run Code Online (Sandbox Code Playgroud)

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

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


Kri*_*tix 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;
Run Code Online (Sandbox Code Playgroud)