【问题标题】:Return 0 if field is null in MySQL如果字段在 MySQL 中为空,则返回 0
【发布时间】:2010-10-22 13:38:15
【问题描述】:

在 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?

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    使用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:不-别名在最后。
    • @MarkByers 你能说明为什么凯文在评论中的例子是错误的,它应该是什么?
    • 非常感谢!!这正是我想要的
    • @MarkByers IFNOtNULL(expr1, 1) 有没有类似的东西
    【解决方案2】:

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

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

    假设您的数据库的读取次数多于写入次数(而且大多数都是),这将摊销成本。

    【讨论】:

    • 每周发生一次,向所有客户收费。数据整周写入,然后在特定时间进行计算和计费。把它想象成订阅服务。您可以在计费周期内进行更改,并按适当的时间间隔对您的活动收费。
    • 我要补充一点,在这种情况下,我更喜欢合并,因为它与 MS 和 My SQL 的语法相同,而 MS SQL 是 iSnull 而 MySQL 是 iFnull,如果这对任何人都很重要的话。 (MySQL 的 ISNULL 是一个不同于 MS SQL 的 ISNULL 的函数)
    【解决方案3】:

    以上答案对我来说都不完整。 如果你的字段命名为field,那么选择器应该是下面这个:

    IFNULL(`field`,0) AS field
    

    例如在 SELECT 查询中:

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

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

    【讨论】:

      【解决方案4】:

      你可以试试这样的

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

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

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

      【讨论】:

      • 这在 SELECT 与普通 IFNULL(var, 0) 的中间对我来说非常有用
      【解决方案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;
      

      【讨论】:

        猜你喜欢
        • 2020-10-05
        • 1970-01-01
        • 2021-11-30
        • 2023-04-10
        • 2015-01-18
        • 1970-01-01
        • 1970-01-01
        • 2021-10-22
        相关资源
        最近更新 更多