MySQLでフィールドがnullの場合は0を返します


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

MySQLでNULLに0を返すにはどうすればよいですか?

回答:


326

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)でしょうか?
ケビン

2
@Kevin:いいえ-エイリアスは最後にあります。
Mark Byers、

2
@MarkByersは、コメント内のケビンの例がなぜ間違っているのか、そして実際にどうあるべきなのかを示すことができますか?
マイケル、

どうもありがとうございます !!これはまさに私が探していたものです
brunoblis

@MarkByers IFNOtNULL(expr1、1)はそのようなものはあります
ノニ

25

coalesce(column_name,0)代わりに使用できますcolumn_name。このcoalesce関数は、リスト内の最初のNULL以外の値を返します。

このような行ごとの関数は、通常、スケーラビリティの点で問題があります。あなたのデータベースはまともなサイズであるために得るかもしれないと思うなら、それから、コストを移動するために余分な列およびトリガーを使用することが多い方が良いでしょうselectinsert/update

これは、データベースが書き込まれるよりも読み取られる頻度が高いと想定してコストを償却します(ほとんどの場合はそうです)。


これは、すべての顧客に請求するために週に1回行われます。データはすべての週に書き込まれ、特定の時間に計算され、請求されます。サブスクリプションサービスのようなものと考えてください。請求期間の期間中に変更を加えることができ、アクティビティは適切な間隔で請求されます。
ケビン

この状況では、MSとMy SQLの構文は同じであるため、MS SQLはiSnullで、MySQLはiFnullであるため、合体した方がよいと追加します。(MySQLのISNULLは、MS SQLのISNULLとは異なる関数です)
Craig Jacobs

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)の
中間でうまく機能しました

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;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.