مرکزی مواد پر جائیں
ماڈیول 4 · سبق 2 از 4کورس میں 14/57~10 min
ماڈیول اسباق (2/4)

NULLs کو سنبھالنا: IS NULL اور COALESCE

employees ڈیٹاسیٹ میں، Andrea Costa خاص ہے: اس کے پاس ہے۔ department_id = NULL آپ پہلے ہی NULL کے خلاف برش کر چکے ہیں (کے ساتھ LEFT JOIN)، لیکن اسے سنجیدگی سے لینے کا وقت آگیا ہے: NULLs 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 فال بیک

اکثر آپ NULL کے بجائے کچھ ڈسپلے کرنا چاہتے ہیں جب ڈیٹا غائب: تار '(none)'، صفر، ایک طے شدہ تاریخ۔ فنکشن جو کیا بالکل یہ COALESCE(a, b, c, ...) ہے: یہ پہلا لوٹاتا ہے فہرست میں غیر NULL دلیل۔

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) اوسط NULLs کو نظر انداز کر رہا ہے — یہ نہیں ان کے ساتھ 0 کے طور پر برتاؤ کرتا ہے؛
  • SUM(...) صرف غیر NULL اقدار کا مجموعہ ہے۔

یہ تقریبا ہمیشہ وہی ہوتا ہے جو آپ چاہتے ہیں۔ لیکن یہ جاننا اچھا ہے: اگر آپ ہیں۔ تلاش کر رہے ہیں "ملازمین کی کل تعداد" کا استعمال کریں COUNT(*)، نہیں COUNT(department_id)

اسے آزمائیں

ورزش#sql.m4.l2.e1
کوششیں: 0لوڈ ہو رہا ہے…

ہر ملازم کے لیے، پہلا نام (first_name)، آخری نام (last_name) اور ایک کالم 'dipartimento_id' دکھائیں جو ان کے Department_id یا -1 کے برابر ہو اگر تفویض نہیں کیا گیا ہے۔ تین کالم، ایک قطار فی ملازم۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

NULL کو -1 سے بدلنے کے لیے COALESCE(department_id, -1) کا استعمال کریں۔

3 کوششوں کے بعد حل دستیاب ہے۔

ورزش کا جائزہ لیں۔

ورزش#sql.m4.l2.e2
کوششیں: 0لوڈ ہو رہا ہے…

تمام ملازمین کا پہلا نام (first_name)، آخری نام (last_name) اور محکمے کا نام (departments.name) لوٹائیں، جب محکمہ غائب ہو تو '(nessuno)' دکھائیں۔ بائیں شمولیت + COALESCE استعمال کریں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

COALESCE(d.name, '(nessuno)') بائیں شمولیت کے ذریعے متعارف کرائے گئے NULL کو ہینڈل کرتا ہے۔

3 کوششوں کے بعد حل دستیاب ہے۔