মূল কন্টেন্টে যান
মডিউল 4 · 2-এর পাঠ 4কোর্সে 14/57~10 min
মডিউল পাঠ (2/4)

NULL হ্যান্ডলিং: IS NULL এবং COALESCE

employees ডেটাসেটে, আন্দ্রেয়া কস্তা বিশেষ: তার আছে department_id = NULL আপনি ইতিমধ্যেই NULL (এর সাথে LEFT JOIN), কিন্তু সময় এসেছে গুরুত্ব সহকারে নেওয়ার: NULL SQL এ অন্য যেকোনো মান থেকে অন্যরকম আচরণ করুন এবং তাদের উপেক্ষা করা অন্যতম প্রোডাকশন কোডে বাগগুলির প্রধান কারণ।

NULL শূন্য নয়, খালি স্ট্রিং নয়

NULL মানে অজানা / অনুপস্থিত মান। এটা 0 নয়, '' নয়, নয় false এটা "আমি জানি না"। এটি থেকে একটি আশ্চর্যজনক সম্পত্তি অনুসরণ করে: NULL কোনো কিছুর সমান নয়, এমনকি নিজেও নয়।

SQL
-- All these expressions return NULL (not true!):
SELECT NULL = NULL;       -- NULL
SELECT NULL = 0;          -- NULL
SELECT NULL <> 'qualcosa'; -- NULL

সুনির্দিষ্ট পরিণতি: WHERE column = NULL কখনো কাজ করে না। আপনাকে অবশ্যই ব্যবহার করতে হবে ডেডিকেটেড অপারেটর IS NULL / IS NOT NULL:

SQL
-- Employees without a department:
SELECT first_name, last_name
FROM   employees
WHERE  department_id IS NULL;

-- Employees WITH a department:
SELECT first_name, last_name
FROM   employees
WHERE  department_id IS NOT NULL;

COALESCE — শূন্য ফলব্যাক

প্রায়শই আপনি NULL এর পরিবর্তে কিছু প্রদর্শন করতে চান যখন ডেটা অনুপস্থিত: স্ট্রিং '(none)', শূন্য, একটি ডিফল্ট তারিখ। ফাংশন যে ঠিক এটিই COALESCE(a, b, c, ...): এটি প্রথমটি ফেরত দেয় নন-নাল আর্গুমেন্ট তালিকায়।

SQL
-- Show the department_id, or 0 if missing:
SELECT first_name, last_name, COALESCE(department_id, 0) AS dept
FROM   employees;

একটি LEFT JOIN এর সাথে মিলিত হয়ে রিপোর্টের জন্য এটি অবিশ্বাস্যভাবে শক্তিশালী হয়ে ওঠে:

SQL
SELECT e.first_name,
       e.last_name,
       COALESCE(d.name, '(nessun dipartimento)') AS dipartimento
FROM   employees   AS e
LEFT JOIN departments AS d ON e.department_id = d.id;

ফলাফল: সমস্ত কর্মচারীরা ডিপার্টমেন্টের নাম বা স্পষ্টভাবে ফিরে এসেছে যাদের নেই তাদের জন্য লেবেল।

NULL এবং সমষ্টি

সমষ্টিগত ফাংশন উপেক্ষা করুন NULLs (COUNT(*) ছাড়া):

  • COUNT(department_id) শুধুমাত্র একটি মান সহ সারি গণনা করে;
  • AVG(salary) গড় NULL কে উপেক্ষা করে — এটি তাদের 0 হিসাবে না বিবেচনা করে;
  • SUM(...) যোগফল শুধুমাত্র অ-NULL মান।

এই আপনি কি চান প্রায় সবসময়. কিন্তু এটা জেনে রাখা ভালো: যদি আপনি হন "মোট কর্মচারীর সংখ্যা" COUNT(*) ব্যবহার করা হচ্ছে, নয় COUNT(department_id)

চেষ্টা করে দেখুন

ব্যায়াম#sql.m4.l2.e1
প্রচেষ্টা: 0লোড হচ্ছে...

প্রত্যেক কর্মচারীর জন্য, প্রথম নাম (প্রথম_নাম), পদবী (শেষ_নাম) এবং একটি কলাম 'dipartimento_id' দেখান যা তাদের বিভাগ_আইডি বা -1 বরাদ্দ না করলে সমান হয়। তিন কলাম, প্রতি কর্মী এক সারি।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

NULL-কে -1 দিয়ে প্রতিস্থাপন করতে COALESCE(department_id, -1) ব্যবহার করুন।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম পর্যালোচনা করুন

ব্যায়াম#sql.m4.l2.e2
প্রচেষ্টা: 0লোড হচ্ছে...

সমস্ত কর্মচারীদের প্রথম নাম (first_name), পদবী (last_name) এবং বিভাগের নাম (departments.name) ফেরত দিন, যখন বিভাগটি অনুপস্থিত থাকে তখন '(nessuno)' দেখান। Left Join + COALESCE ব্যবহার করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

COALESCE(d.name, '(nessuno)') বাম যোগদান দ্বারা প্রবর্তিত NULL পরিচালনা করে।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ