代码之家  ›  专栏  ›  技术社区  ›  Kevin

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

  •  126
  • Kevin  · 技术社区  · 14 年前

    以下是我所拥有的:

    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;
    

    除了空字段应该是 0 .

    6 回复  |  直到 10 年前
        1
  •  306
  •   Mark Byers    14 年前

    使用 IFNULL :

    IFNULL(expr1, 0)
    

    从文档中:

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

        2
  •  25
  •   paxdiablo    14 年前

    你可以用 coalesce(column_name,0) column_name . 这个 coalesce

    我应该提到,这样的每行函数对于可伸缩性通常是有问题的。如果您认为您的数据库可能变得相当大,那么最好使用额外的列和触发器将成本从 select insert/update .

        3
  •  10
  •   Gianpaolo Papa    6 年前

    以上的答案对我来说都不完整。 如果你的领域被命名 field ,因此选择器应为以下选择器:

    IFNULL(`field`,0) AS field
    

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

    希望这能帮助人们不要浪费时间。

        4
  •  5
  •   ackuser    9 年前

    你可以试试这样的东西

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

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

        5
  •  5
  •   Krishna_K_Batham    7 年前

    是的,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;