جایگزینی دستور 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 نوع اول با تعداد تکرار بالا استفاده نماییم، اتصال با یک جدول جدید که حاوی اطلاعات است روش بهتری می باشد.

2 پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگوها شرکت کنید؟
در گفتگو ها شرکت کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *