ক্ষেত্রটি মাইএসকিউএলে শূন্য হলে 0 ফেরান


160

মাইএসকিউএলে, "মোট" ক্ষেত্রগুলি শূন্যে সেট করার কোনও উপায় আছে যদি সেগুলি নাল হয়?

আমার যা আছে তা এখানে:

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;

তথ্যগুলি সূক্ষ্মভাবে বেরিয়ে আসে, বাদে NUL ক্ষেত্রগুলি হওয়া উচিত 0

মাইএসকিউএল-এ নুলের জন্য আমি কীভাবে 0 ফিরিয়ে দিতে পারি?

উত্তর:


326

IFNULL ব্যবহার করুন :

IFNULL(expr1, 0)

ডকুমেন্টেশন থেকে:

যদি expr1 NULL না হয়, IFNULL () এক্সট্রা 1 প্রদান করে; অন্যথায় এটি expr2 প্রদান করে। আইএফএনএলএল () কোন প্রেক্ষাপটে ব্যবহৃত হয় তার উপর নির্ভর করে একটি সংখ্যাসূচক বা স্ট্রিংয়ের মান প্রদান করে।


এটি কি IFNULL ((নির্বাচন করুন সুম (uop.price * uop.qty) থেকে uc_order_products কোথাও uo.order_id = uop.order_id) যেমন পণ্য_সুবোটাল, 0)?
কেভিন

2
@ কেভিন: না - উপনামটি শেষে চলে যায়।
মার্ক বাইয়ার্স

2
@ মার্কবায়ার্স আপনি কি দেখাতে পারেন কেন মন্তব্যে কেভিনের উদাহরণটি ভুল এবং এটি আসলে কী হওয়া উচিত?
মাইকেল

তোমাকে অনেক ধন্যবাদ !! এটি ঠিক আমি যা খুঁজছিলাম
ব্রুনোব্লিস

@ মার্কবায়ার্স IFNOtNULL (expr1, 1) এর মতো কিছু আছে
ননি

25

আপনি ন্যায়বিচারের coalesce(column_name,0)পরিবর্তে ব্যবহার করতে পারেন column_namecoalesceফাংশন তালিকার প্রথম অ শূন্য মান ফেরায়।

আমার উল্লেখ করা উচিত যে প্রতি-সারি ফাংশনগুলি সাধারণত স্কেলিবিলিটির জন্য সমস্যাযুক্ত। আপনি কি মনে করেন আপনার ডাটাবেস একটি শালীন আকার হতে পেতে পারে, এটা প্রায়ই থেকে খরচ সরাতে অতিরিক্ত কলাম এবং ট্রিগার ব্যবহার করতে ভালো selectকরার insert/update

এটি আপনার ডেটাবেসটি লিখিত চেয়ে বেশি বার পড়া হয় (এবং তাদের বেশিরভাগটি হ'ল) ​​ধরে নেওয়া ব্যয়ের পরিমাণটি বাড়িয়ে তোলে।


সমস্ত গ্রাহকদের বিল দেওয়ার জন্য এটি সপ্তাহে একবার হয়। ডেটা পুরো সপ্তাহে লেখা হয়, তারপরে একটি নির্দিষ্ট সময়ে, এর গণনা এবং বিল দেওয়া হয়। এটিকে সাবস্ক্রিপশন পরিষেবার মতো ভাবেন। আপনি বিলিং সময়কালের সময়কালে পরিবর্তন করতে পারেন এবং আপনার ক্রিয়াকলাপটি উপযুক্ত বিরতিতে চার্জ করা হয়।
কেভিন

আমি যুক্ত করব যে এই পরিস্থিতিতে আমি কোয়েলেসকে পছন্দ করব কারণ এটি এমএস এবং মাই এসকিউএলগুলির জন্য একই সিনট্যাক্স, যদিও এমএস এসকিউএল আই এসএনউল এবং মাইএসকিউএল আইফনুল, যদি তা কারও কাছে বিবেচিত হয়। (মাইএসকিউএলএস ইসনুল এমএস এসকিউএল এর আইএসএনএল এর চেয়ে আলাদা ফাংশন)
ক্রেগ জ্যাকবস

11

উপরের উত্তরগুলির কোনোটাই আমার জন্য সম্পূর্ণ ছিল না। যদি আপনার ক্ষেত্রটির নাম দেওয়া হয় field, তবে নির্বাচকটি নিম্নলিখিত এক হওয়া উচিত:

IFNULL(`field`,0) AS field

একটি নির্বাচন প্রশ্নে উদাহরণস্বরূপ:

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

আশা করি এটি কাউকে সময় নষ্ট করতে সহায়তা করতে পারে।


5

আপনি এরকম কিছু চেষ্টা করতে পারেন

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

এটি খালি স্ট্রিং হলে অ্যাট্রিবিউট এক্সকে শূন্য বলে ধরে নেওয়া হয়, সুতরাং এর পরে আপনি শেষ মানের পরিবর্তে শূন্য হিসাবে ঘোষণা করতে পারেন। অন্য ক্ষেত্রে এটির মূল মূল্য থাকবে।

যাইহোক, কেবল এটি করার জন্য অন্য উপায় দেওয়া।


এটি আমার জন্য সাধারণ 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.