यदि MySQL में फ़ील्ड शून्य है, तो 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 कहां है। u_order_id = uop.order_id) AS products_ubtotal, 0)?
केविन

2
@ केविन: नहीं - उपनाम अंत में जाता है।
मार्क बायर्स

2
@MarkByers आप दिखा सकते हैं कि टिप्पणी में केविन का उदाहरण गलत क्यों है और यह वास्तव में क्या होना चाहिए?
माइकल

बहुत बहुत धन्यवाद !! यह वही है जिसकी मैं तलाश कर रहा था
brunobliss

@MarkByers IFNOtNULL (expr1, 1) ऐसा कुछ भी नहीं है
नोनी

25

आप coalesce(column_name,0)सिर्फ के बजाय उपयोग कर सकते हैं column_namecoalesceसमारोह सूची में पहले गैर-शून्य मान देता है।

मुझे यह उल्लेख करना चाहिए कि इस तरह प्रति-पंक्ति फ़ंक्शन आमतौर पर स्केलेबिलिटी के लिए समस्याग्रस्त हैं। यदि आपको लगता है कि आपके डेटाबेस को एक सभ्य आकार मिल सकता है, तो लागत को स्थानांतरित करने के लिए अतिरिक्त कॉलम और ट्रिगर्स का उपयोग करना अक्सर बेहतर selectहोता है insert/update

यह लागत को परिशोधित करता है मान लें कि आपका डेटाबेस लिखित (और उनमें से ज्यादातर) की तुलना में अधिक बार पढ़ा जाता है।


यह सभी ग्राहकों को बिल देने के लिए सप्ताह में एक बार होता है। डेटा पूरे सप्ताह लिखा जाता है, फिर एक निश्चित समय पर, इसकी गणना और बिल किया जाता है। इसे सब्सक्रिप्शन सेवा की तरह समझें। आप बिलिंग अवधि के दौरान परिवर्तन कर सकते हैं, और आपकी गतिविधि को उचित अंतराल पर चार्ज किया जाता है।
केविन

मुझे लगता है कि मैं इस स्थिति में जोड़ देता हूं कि मैं Coalesce becasue पसंद करूंगा यह MS और My SQLs के लिए एक ही वाक्यविन्यास है, जबकि MS SQL iSnull है और MySQL iFnull है, अगर यह किसी के लिए भी मायने रखता है। (MySQLs ISNULL MS SQL के ISNULL की तुलना में एक अलग कार्य है)
क्रेग जैकब्स

11

उपरोक्त कोई भी उत्तर मेरे लिए पूर्ण नहीं थे। यदि आपके क्षेत्र का नाम है field, तो चयनकर्ता निम्नलिखित होना चाहिए:

IFNULL(`field`,0) AS field

एक चयनित क्वेरी में उदाहरण के लिए:

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

आशा है कि यह किसी को समय बर्बाद नहीं करने में मदद कर सकता है।


5

आप कुछ इस तरह की कोशिश कर सकते हैं

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

एट्रिब्यूट X को खाली मान लिया जाता है यदि यह एक खाली स्ट्रिंग है, तो इसके बाद आप अंतिम मान के बजाय शून्य घोषित कर सकते हैं। एक अन्य मामले में, यह इसका मूल मूल्य बना रहेगा।

वैसे भी, बस ऐसा करने के लिए एक और तरीका देना है।


इसने मेरे लिए एक सेलेक्ट बनाम सामान्य 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.