Поверніть 0, якщо поле в MySQL недійсне


160

Чи є у 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?

Відповіді:


326

Використовуйте IFNULL :

IFNULL(expr1, 0)

З документації:

Якщо expr1 не NULL, IFNULL () повертає expr1; в іншому випадку він повертає expr2. IFNULL () повертає числове або рядкове значення, залежно від контексту, в якому воно використовується.


Це буде IFNULL ((SELECT SUM (uop.price * uop.qty) FROM uc_order_products sploh WHERE uo.order_id = uop.order_id) AS products_subtotal, 0)?
Кевін

2
@Kevin: Ні - псевдонім йде в кінці.
Марк Байєрс

2
@MarkByers Ви можете показати, чому приклад Кевіна в коментарі невірний і яким він насправді повинен бути?
Майкл

Дуже дякую !! Це саме те, що я шукав
brunobliss

@MarkByers IFNOtNULL (expr1, 1) є щось подібне
Ноні

25

Ви можете використовувати coalesce(column_name,0)замість просто column_name. coalesceФункція повертає перше значення , НЕ NULL в списку.

Я мушу зазначити, що такі рядкові функції, як ця, зазвичай є проблематичними для масштабування. Якщо ви думаєте, що ваша база може отримати пристойний розмір, часто краще використовувати додаткові стовпці та тригери, щоб перемістити вартість з " selectна" insert/update.

Це амортизує витрати, припускаючи, що ваша база даних читається частіше, ніж написана (і більшість з них є).


Це відбувається раз на тиждень, щоб виставити рахунок усім клієнтам. Дані записуються цілий тиждень, потім у певний час обчислюються та виставляються рахунки. Подумайте про це як про послугу передплати. Ви можете внести зміни протягом строку платежного періоду, і ваша діяльність стягується через відповідні проміжки часу.
Кевін

Я додам, що в цій ситуації я вважаю за краще поєднатись, оскільки це той самий синтаксис для MS та My SQL, тоді як MS SQL - iSnull, а MySQL - iFnull, якщо це важливо для когось. (MySQL ISNULL - це інша функція, ніж ISNULL MS SQL)
Крейг Джейкобс

11

Жодна з наведених відповідей для мене не була повною. Якщо ваше поле названо field, то селектором має бути наступне:

IFNULL(`field`,0) AS field

Наприклад у запиті SELECT:

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

Сподіваюся, це може допомогти комусь не витрачати час.


5

Можна спробувати щось подібне

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

Атрибут X вважається порожнім, якщо це порожній рядок, тож після цього ви можете оголосити як нуль замість останнього значення. В іншому випадку це залишатиметься початковою цінністю.

У будь-якому випадку, просто дати інший спосіб зробити це.


Це працювало для мене чудово посеред SELECT проти звичайного IFNULL (var, 0)
ajankuv

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;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.