ماڈیول اسباق (2/4)
NULLs کو سنبھالنا: IS NULL اور COALESCE
employees ڈیٹاسیٹ میں، Andrea Costa خاص ہے: اس کے پاس ہے۔
department_id = NULL آپ پہلے ہی NULL کے خلاف برش کر چکے ہیں (کے ساتھ
LEFT JOIN)، لیکن اسے سنجیدگی سے لینے کا وقت آگیا ہے: NULLs SQL میں
کسی بھی دوسری قدر سے مختلف برتاؤ کریں، اور ان کو نظر انداز کرنا ان میں سے ایک ہے۔
پروڈکشن کوڈ میں کیڑے کی اہم وجوہات۔
NULL صفر نہیں ہے، خالی سٹرنگ نہیں ہے۔
NULL کا مطلب ہے نامعلوم / غائب قدر۔ یہ 0 نہیں ہے، '' نہیں ہے، نہیں
false یہ "مجھے نہیں معلوم" ہے۔ اس سے ایک حیرت انگیز جائیداد درج ذیل ہے:
NULL کسی چیز کے برابر نہیں ہے، خود بھی نہیں۔
-- 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:
-- 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 دلیل۔
-- Show the department_id, or 0 if missing:
SELECT first_name, last_name, COALESCE(department_id, 0) AS dept
FROM employees;ایک LEFT JOIN کے ساتھ مل کر یہ رپورٹس کے لیے ناقابل یقین حد تک طاقتور ہو جاتا ہے:
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)
اسے آزمائیں
ہر ملازم کے لیے، پہلا نام (first_name)، آخری نام (last_name) اور ایک کالم 'dipartimento_id' دکھائیں جو ان کے Department_id یا -1 کے برابر ہو اگر تفویض نہیں کیا گیا ہے۔ تین کالم، ایک قطار فی ملازم۔
اشارہ دکھائیں۔
NULL کو -1 سے بدلنے کے لیے COALESCE(department_id, -1) کا استعمال کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔
ورزش کا جائزہ لیں۔
تمام ملازمین کا پہلا نام (first_name)، آخری نام (last_name) اور محکمے کا نام (departments.name) لوٹائیں، جب محکمہ غائب ہو تو '(nessuno)' دکھائیں۔ بائیں شمولیت + COALESCE استعمال کریں۔
اشارہ دکھائیں۔
COALESCE(d.name, '(nessuno)') بائیں شمولیت کے ذریعے متعارف کرائے گئے NULL کو ہینڈل کرتا ہے۔
3 کوششوں کے بعد حل دستیاب ہے۔