خانه/ مبانی SQL/ CASE

CASE: نوشتن منطق شرطی داخل پرس‌وجو

مبتدی ۱۳ دقیقه مطالعه

این آخرین درس فصل «مبانی SQL» است. تا اینجا یاد گرفتیم چطور داده بخوانیم، فیلتر کنیم و مرتب کنیم؛ اما گاهی نیاز داریم بر اساس مقدار یک ستون، منطق «اگر... آنگاه... وگرنه...» بنویسیم — دقیقاً کاری که CASE انجام می‌دهد.

نحو ساده (Simple CASE)

وقتی فقط می‌خواهی یک ستون را با چند مقدار ثابت مقایسه کنی:

sql
SELECT full_name, city,
  CASE city
    WHEN N'تهران' THEN N'مرکز'
    WHEN N'شیراز' THEN N'جنوب'
    ELSE N'سایر'
  END AS Region
FROM students;
امتحانش کن — نحو ساده

نحو جستجویی (Searched CASE) — پرکاربردتر

وقتی شرط پیچیده‌تر از یک برابری ساده است (مثل بازه یا مقایسه)، از فرم جستجویی استفاده می‌کنیم:

sql
SELECT full_name, grade,
  CASE
    WHEN grade = 9 THEN N'متوسطه اول'
    WHEN grade >= 10 THEN N'متوسطه دوم'
    ELSE N'نامشخص'
  END AS Level
FROM students;

ترتیب شرط‌ها مهم است!

WHENها از بالا به پایین بررسی می‌شوند و به‌محض اولین تطبیق، بقیه نادیده گرفته می‌شوند — حتی اگر آن‌ها هم درست باشند. این پرس‌وجو یک باگ رایج دارد:

sql
-- باگ‌دار: چون grade=10 هم شرط اول (>=10) را برآورده می‌کند،
-- هرگز به شرط دوم "دهم" نمی‌رسد
CASE
  WHEN grade >= 10 THEN N'دوره دوم'
  WHEN grade = 10 THEN N'دهم'
  ELSE N'نامشخص'
END

راه‌حل: همیشه خاص‌ترین شرط را اول بنویس:

sql
CASE
  WHEN grade = 10 THEN N'دهم'
  WHEN grade >= 11 THEN N'یازدهم به بالا'
  ELSE N'نامشخص'
END

بیا هر دو حالت را با هم مقایسه کنیم:

امتحانش کن — باگ ترتیب WHEN (نسخه‌ی باگ‌دار)
می‌بینی؟ همه‌ی ردیف‌های grade = 10 برچسب «دوره دوم» گرفتند، نه «دهم» — دقیقاً همان باگی که توضیح دادیم. حالا خودت ترتیب دو WHEN را در ویرایشگر بالا عوض کن (شرط grade = 10 را اول بیاور) و دوباره اجرا کن تا نتیجه‌ی درست را ببینی.

ELSE اختیاری است، اما مراقب باش

اگر ELSE ننویسی و هیچ‌کدام از WHENها هم مطابقت نداشته باشند، نتیجه به‌سادگی NULL می‌شود. توصیه می‌شود همیشه صریحاً ELSE بنویسی، حتی اگر فقط برای وضوح کد باشد.

استفاده از CASE در ORDER BY

CASE محدود به SELECT نیست؛ در ORDER BY هم می‌توان از آن برای مرتب‌سازی سفارشی استفاده کرد — مثلاً دانش‌آموزان تهرانی همیشه اول لیست، بقیه بعد از آن‌ها به ترتیب حروف الفبا:

sql
SELECT full_name, city
FROM students
ORDER BY
  CASE WHEN city = N'تهران' THEN 0 ELSE 1 END,
  full_name;
امتحانش کن — مرتب‌سازی سفارشی با CASE

جمع‌بندی این درس (و کل فصل ۲)

  • نحو ساده (CASE column WHEN ...) فقط برابری را چک می‌کند؛ نحو جستجویی (CASE WHEN condition ...) هر شرطی را می‌پذیرد و پرکاربردتر است.
  • WHENها به‌ترتیب از بالا بررسی می‌شوند؛ خاص‌ترین شرط را همیشه اول بنویس.
  • بدون ELSE، عدم تطبیق یعنی نتیجه‌ی NULL.
  • CASE در SELECT، WHERE و ORDER BY — هرجا یک عبارت مجاز باشد — قابل استفاده است.

با این درس، فصل ۲ (مبانی SQL) کامل شد! از فصل بعدی وارد دنیای تجمیع داده‌ها می‌شویم: COUNT, SUM, AVG و GROUP BY — جایی که به‌جای دیدن ردیف‌های تک‌تک، شروع به خلاصه‌سازی و تحلیل داده می‌کنیم.