2010-10-22 230 views
104

在MySQL中,如果“总数”字段为NULL,是否可以将其设置为零?如果MySQL中的字段为空,则返回0

以下是我有:

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?

回答

213

使用IFNULL

IFNULL(expr1, 0) 

从文档:

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

+0

那是要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-10-22 13:46:10

+2

@凯文:不 - 别名在最后。 – 2010-10-22 13:48:59

+1

哎呀。这样可行!谢谢。 – Kevin 2010-10-22 14:01:04

20

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

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

假设您的数据库读取次数多于写入次数(并且大多数次数是),这会使成本分摊。

+0

这种情况每周都会发生一次,为所有客户开票。数据整周写入,然后在某个时间,计算并计费。把它想象成订阅服务。您可以在结算期间的任期内进行更改,并且您的活动按适当的时间间隔收费。 – Kevin 2010-10-22 14:02:45

+0

我会补充说,在这种情况下,我宁愿合并,因为它是MS和我的SQL相同的语法,而MS SQL是iSnull和MySQL是iFnull,如果这对任何人都很重要。 (MySQL的ISNULL是一个不同于MS SQL的ISNULL的函数) – 2016-09-02 18:38:58

3

你可以尝试这样的事情

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

属性假设X为空,如果它是一个空字符串,所以以后就可以视为零,而不是最后一个值声明。在另一种情况下,它将保持其原始价值。

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

+0

这对我来说在SELECT和正常的IFNULL(var,0) – ajankuv 2018-02-18 20:08:06

2

是的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; 
+0

之间很好,我建议你添加一个代码示例,而不仅仅是一个链接。链接可能会过时或更改。 – 2016-11-16 14:31:34

+0

谢谢先生积极。 – 2016-11-16 14:46:45

+0

我已更新我的答案并添加了完整详细的答案。 – 2016-11-16 14:47:16