CASE: نوشتن منطق شرطی داخل پرسوجو
این آخرین درس فصل «مبانی SQL» است. تا اینجا یاد گرفتیم چطور داده بخوانیم، فیلتر کنیم و مرتب کنیم؛ اما گاهی نیاز داریم بر اساس مقدار یک ستون، منطق «اگر... آنگاه... وگرنه...» بنویسیم — دقیقاً کاری که CASE انجام میدهد.
نحو ساده (Simple CASE)
وقتی فقط میخواهی یک ستون را با چند مقدار ثابت مقایسه کنی:
SELECT full_name, city, CASE city WHEN N'تهران' THEN N'مرکز' WHEN N'شیراز' THEN N'جنوب' ELSE N'سایر' END AS Region FROM students;
نحو جستجویی (Searched CASE) — پرکاربردتر
وقتی شرط پیچیدهتر از یک برابری ساده است (مثل بازه یا مقایسه)، از فرم جستجویی استفاده میکنیم:
SELECT full_name, grade, CASE WHEN grade = 9 THEN N'متوسطه اول' WHEN grade >= 10 THEN N'متوسطه دوم' ELSE N'نامشخص' END AS Level FROM students;
ترتیب شرطها مهم است!
WHENها از بالا به پایین بررسی میشوند و بهمحض اولین تطبیق، بقیه نادیده گرفته میشوند — حتی اگر آنها هم درست باشند. این پرسوجو یک باگ رایج دارد:
-- باگدار: چون grade=10 هم شرط اول (>=10) را برآورده میکند، -- هرگز به شرط دوم "دهم" نمیرسد CASE WHEN grade >= 10 THEN N'دوره دوم' WHEN grade = 10 THEN N'دهم' ELSE N'نامشخص' END
راهحل: همیشه خاصترین شرط را اول بنویس:
CASE WHEN grade = 10 THEN N'دهم' WHEN grade >= 11 THEN N'یازدهم به بالا' ELSE N'نامشخص' END
بیا هر دو حالت را با هم مقایسه کنیم:
grade = 10 برچسب «دوره دوم» گرفتند، نه «دهم» — دقیقاً همان باگی که توضیح دادیم. حالا خودت ترتیب دو WHEN را در ویرایشگر بالا عوض کن (شرط grade = 10 را اول بیاور) و دوباره اجرا کن تا نتیجهی درست را ببینی.ELSE اختیاری است، اما مراقب باش
اگر ELSE ننویسی و هیچکدام از WHENها هم مطابقت نداشته باشند، نتیجه بهسادگی NULL میشود. توصیه میشود همیشه صریحاً ELSE بنویسی، حتی اگر فقط برای وضوح کد باشد.
استفاده از CASE در ORDER BY
CASE محدود به SELECT نیست؛ در ORDER BY هم میتوان از آن برای مرتبسازی سفارشی استفاده کرد — مثلاً دانشآموزان تهرانی همیشه اول لیست، بقیه بعد از آنها به ترتیب حروف الفبا:
SELECT full_name, city FROM students ORDER BY CASE WHEN city = N'تهران' THEN 0 ELSE 1 END, full_name;
جمعبندی این درس (و کل فصل ۲)
- نحو ساده (
CASE column WHEN ...) فقط برابری را چک میکند؛ نحو جستجویی (CASE WHEN condition ...) هر شرطی را میپذیرد و پرکاربردتر است. WHENها بهترتیب از بالا بررسی میشوند؛ خاصترین شرط را همیشه اول بنویس.- بدون
ELSE، عدم تطبیق یعنی نتیجهیNULL. CASEدرSELECT،WHEREوORDER BY— هرجا یک عبارت مجاز باشد — قابل استفاده است.
با این درس، فصل ۲ (مبانی SQL) کامل شد! از فصل بعدی وارد دنیای تجمیع دادهها میشویم: COUNT, SUM, AVG و GROUP BY — جایی که بهجای دیدن ردیفهای تکتک، شروع به خلاصهسازی و تحلیل داده میکنیم.