Подтвердить что ты не робот

Возвращает 0, если в MySQL задано значение null

В 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.

Как я могу вернуть 0 для NULL в MySQL?

4b9b3361

Ответ 1

Используйте IFNULL:

IFNULL(expr1, 0)

Из документации:

Если expr1 не является NULL, IFNULL() возвращает expr1; иначе он возвращает expr2. IFNULL() возвращает числовое или строковое значение, в зависимости от контекста, в котором он используется.

Ответ 2

Вместо column_name вы можете использовать coalesce(column_name,0). Функция coalesce возвращает первое не-NULL-значение в списке.

Я должен упомянуть, что такие функции, как это, обычно являются проблематичными для масштабируемости. Если вы считаете, что ваша база данных может быть приличным размером, часто лучше использовать дополнительные столбцы и триггеры для переноса стоимости с select на insert/update.

Это амортизирует затраты, предполагая, что ваша база данных читается чаще, чем написано (и большинство из них).

Ответ 3

Вы можете попробовать что-то вроде этого

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

Атрибут X считается пустым, если он является пустой строкой, поэтому после этого вы можете объявить как ноль вместо последнего значения. В другом случае он останется прежним.

Во всяком случае, просто чтобы дать другой способ сделать это.

Ответ 4

Да Функция 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;