جایگزینی دستور case به جای دستور if/elseدر SQL Server :
چگونه ما می توانیم منطقی مشابه if/else در query های موجود در T-SQL وارد نماییم؟
در واقع T-SQL با کمک دستور case اجازه ی استفاده از یک سوییچ با کاربردی مشابه ساختار if/else در زبان های دیگر را فراهم می کند. دو نوع case داریم که به لحاظ ساخت کاملا با هم متفاوت هستند. نوع اول دستور case ساده (simple case statement) برای ارزیابی مقادیر یکسان و نوع دوم دستور case با قابلیت جستجو(searched case statement) برای مقایسه ی تفاوت ها می باشد.
Simple case statement
این نوع از case فقط یک عبارت را به عنوان ورودی می گیرد و سپس آن را با همه ی مقادیر موجود در عبارت when مقایسه می کند.خروجی هر عبارت با then تولیدمی شود. عبارت else نیز در مواقعی به کار می رود که داده ی ورودی با هیچ یک از داده ها ی موجود در when منطبق نباشد. برای شرح بیشتر به کد زیر توجه نمایید:

در این مثال رتبه هر سر باز لیست می شود در صورتی که بخواهیم مقدار PayGrade را داشته باشیم می توانیم با ایجاد وابستگی میان این مقدار و MilRank با استفاده ازcase این کار را انجام دهیم.در کد زیر مشاهده می کنیم :

استفاده از چنین دستوری می تواند با ایجاد جداول و اتصال آن ها به هم عملکرد بهتری نسبت به استفاده مستقیم از این دستورcase را داشته باشد.به طور کلی، هنگامی که فرایند مقایسه در تعداد زیادی query جداگانه انجام شود، کارای بیشتری خواهد داشت. بویژه هنگامی که باید امکانات بسیاری در این دستور case لیست شوند. کد زیر را مشاهده نمایید:

دستور case برای به دست آوردن rank هایی که جا مانده اند، یا به هر علتی جدول فاقد این rank ها می باشد و یا به این دلیل که آن ها به عنوان یک شرط در لیست مقایسه دستور case وجود ندارند، تابع else ساده و مناسبی را تعریف می کند.ما می توانیم این منطق را ا کمک left join, coalesce به طور کامل پیاده کنیم.

اگرچه این query با استفاده از coalesce به همان نتیجه ی case می رسد ولی مسیر رسیدن به نتایج و روند اجرای آن ها با هم متفاوت می باشد.

دستور case با قابلیت جستجو(Searched Case Statement)
در دستور case نوع اول تنها یک عبارت به عنوان ورودی گرفته می شود و شرط برابری برای آن مقایسه می شود. این در حالی است که در دستور case نوع دوم مجموعه ای از عبارت ها را به عنوان ورودی داریم که به ازای ارزیابی صحیح خروجی را بر می گردانند . در واقع در case نوع دوم عبارت خروجی از اولین دستورحاوی عبارت ورودی است که در ارزیابی مقدار true را برگرداند. برای مثال اگر ما بخواهیم میان سربازها و افسران تمایز قائل شویم، کد زیر را داریم:


از آن جا که این نوع از دستور case ممکن است هر مقدار بولین را هم به عنوان ورودی بپذیرد، لازم به یاد آوری است عبارت خروجی را برای اولین when که مقدار true بر می گرداند ایجاد می شود، حتی اگر بیش ازیک عبارت when،مقدار true برگرداند.

برای مثال اگر بخواهیم قرن در جدول Medalofhonor پیدا کنیم :

موقعیت دستور case
دستور case می تواند در هرجایی ازsql که بتواند یک عبارت را قبول کند ، قرار گیرد. این دستور می تواند در where, order by, having و هم چنین برای update ,delete و merge به همان راحتی که در select به کار می روند، وجود دارد. برای مثال برای تشخیص اینکه یک شخص افسر است و یا سرباز با کمک case اطلاعات مربوط به milrank را ساده ه تر کنیم:


دستور case یک دستور ساده و انعطاف پذیر برای اضافه کردن قواعد شرطی در SQL می باشد که می تواند به عنوان یک تابع با ساختاری مشابه if/else استفاده شود .در بسیاری موارد اگر هنگامی که قرار باشد از case نوع اول با تعداد تکرار بالا استفاده نماییم، اتصال با یک جدول جدید که حاوی اطلاعات است روش بهتری می باشد.
So useful
Now I can recognize difference between two types of case much better than before
Thanks
بسیار مفید و ارزنده بود مخصوصا قسمت دوم که بسیار کاربردی هم هست.