Возвращает 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?
Ответы
Ответ 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;