دستور CASE در SQL – از کاربرد تا نحوه استفاده به زبان ساده
یکی از بهترین روشها برای پیدا کردن شغل در رشتهای مانند تحلیلگر داده یا دانشمند داده تسلط به پایگاههای داده رابطهای و «زبان کوئری ساختاریافته» (Structured Query Language | SQL) است. با تسلط به SQL موفق خواهید شد به وسیله «ایجاد رکوردها» (Creating Records)، «خواندن دادهها» (Reading Data)، «بهروز رسانی رکوردها» (Updating Records) و «حذف رکوردها» (Deleting Records) پایگاههای داده را مدیریت کنید. مجموعه این عملیات بهصورت اختصاری بهنام CRUD شناخته میشود. این عملیات زیر مجموعه «زبان کار با داده» (Data Manipulation Language | DML) قرار می گیرند. گاهی اوقات، در زمان اجرای عملیات CRUD با موقعیتهای بر میخوریم که در آنها برای اجرا عملیات باید دادههای شامل شرایط خاصی را هدف گرفت. این شرایط خاص را با استفاده از دستور CASE در SQL میتوان مدیریت کرد.
در این مطلب از مجله فرادرس، به بحث و بررسی دقیق دستور CASE در SQL پرداختهایم و تلاش میکنیم بهصورت دقیق روش کار دستور CASE در هر کدام از عملیات مربوط به CRUD را بیاموزیم.
دستور CASE در SQL چیست؟
دستور CASE در SQL این امکان را فراهم میکند که شرایط مختلف را ارزیابی کنیم و زمانی که شرط خاصی فراهم شد، مقدار متناظر با آن حالت را برگردانیم. عبارت CASE همیشه با کلمه کلیدی CASE شروع و با کلمه کلیدی END به پایان میرسد. اگر در سناریو مورد نظرمان هیچ شرطی برقرار نشد میتوانیم از عبارت ELSE نیز برای برگرداندن مقدار خاص دیگری استفاده کنیم. در حالت بر قرار نشدن هیچ کدام از شرطهای دستور CASE در SQL اگر از عبارت ELSE استفاده نکنیم، به عنوان خروجی، مقدار NULL برگشت داده میشود. باید بدانیم که دستور CASE در SQL میتواند حدود 255 شرط مختلف را ارزیابی کند.
از آنجا که عبارت CASE در تبدیل و جابهجا کردن دادههای خروجی کمک بسیار زیادی میکند استفاده از دستورات CASE در SQL میتواند بسیار سودمند باشد. برای مثال تصور کنید لیستی از حالتهای مختلف وجود دارد که باید برای هر کدام کلمه مخفف یا شکل کوتاه شده آن را استفاه کرد. برای مثال، میتوانیم با استفاده از دستور CASE هر جا که از نام «کالیفرنیا» (California) استفاده شده بود کارکترهای CA را برگردانیم.
آماده کردن داده های نمونه برای شروع کار
همانطور که دستور CASE در SQL را بررسی میکنیم به دادههایی نیز برای کار با این دستور و مثالهایش نیاز خواهیم داشت. برای اجرای مثالها، دادههایی با ساختن جدول موقتی و وارد کردن چند ردیف داده فرضی در آن جدول ایجاد میکنیم. در SQL server جدولهایی که اسمشان با استفاده از علامت هشتگ # شروع میشود جدول موقتی هستند.
به کد زیر نگاه کنید و در صورت لزوم در سیستم خود کپی کنید. از این کد برای ایجاد جدول موقتی استفاده شده است.
1create table #temp_table (
2 personID int IDENTITY(1,1) PRIMARY KEY
3 , [state] varchar(50)
4 , raceEthnicityCode int
5 , lastName varchar(50)
6 , firstname varchar(50)
7 , income int
8)
9
10insert into #temp_table ([state], raceEthnicityCode, lastName, firstname, income)
11values ('Minnesota', 6, 'Johnson', 'Oliver', 100000)
12insert into #temp_table ([state], raceEthnicityCode, lastName, firstname, income)
13values ('Minnesota', 1, 'Gasga', 'Luis', 102000)
14insert into #temp_table ([state], raceEthnicityCode, lastName, firstname, income)
15values ('California', 2, 'Anderson', 'Kristen', 200000)
16insert into #temp_table ([state], raceEthnicityCode, lastName, firstname, income)
17values ('Kentucky', 2, 'Anderson', 'Jenny', 65000)
18insert into #temp_table ([state], raceEthnicityCode, lastName, firstname, income)
19values ('Kentucky', 7, 'Clinton', 'Lamar', 82000)
20
21select * from #temp_table
با کمک کد بالا جدول موقتی #temp_table به همراه چند داده فرضی ایجاد میشود.
دستور CASE در SQL چگونه نوشته می شود؟
سینتکس دستور CASE در SQL کاملا ساده است. اما موارد استفاده از این دستور گاهی میتواند پیچیده باشد. زیرا با توجه به شرایط مختلف باید منطق، توابع یا عبارتهای تو در توی متفاوتی را در این دستور استفاده کنیم. کلمه کلیدی CASE میتواند در عبارتهای دستوری مختلفی مانند SELECT و UPDATE و DELETE و SET همراه با کلمات کلیدی مختلفی مانند WHERE و ORDER BY و HAVING در SQL استفاده شود.
در کد زیر شکل پایه سینتکس این عبارت را میبینید.
1CASE
2WHEN condition_1 THEN result_1
3WHEN condition_2 THEN result_2
4WHEN condition_n THEN result_n…
5ELSE result
6END
برای ادامه کار بهتر است که در ابتدا نگاهی به پارامترهای درون سینتکس بالا بیاندازیم. توجه کنید که دستور CASE در SQL از کلمات WHEN و THEN برای ارزیابی شرط و بر گرداندن خروجی استفاده میکند. پایگاه داده شروع به بررسی شرایط تعیین شده برای دستور CASE میکند. بعد از اینکه پایگاه داده اولین شرط برقرار را پیدا کرد نتیجه متناظر با آن شرط را برگشت میدهد. سپس ارزیابی عبارت دستور CASE در پایگاه داده متوقف میشود. دادن نام مستعار به عبارت CASE اختیاری است. اما به پایان رسیدن بررسی شرایط یا توقف اجرای باقیمانده عبارت CASE بعد از بر گرداندن نتیجه پیدا شده در عبارت SELECT یا وقتی که نام ستون NULL شد اجباری است.
چطور در کار با SQL حرفه ای تر شویم؟
در صورتی که در مراحل اولیه آشنایی نسبت به زبان برنامهنویسی SQL هستید، وبسایت آموزشی فرادرس فیلمهای بسیار مناسبی از دورههای مختلف برای آموزش SQL فراهم کرده است. این دورههای آموزشی میتوانند مهارتهای سطح مبتدی، متوسط و حرفهای را بهخوبی آموزش دهند. دروههای که در ادامه آمدهاند به ترتیب سطوح مختلف مهارت را آموزش میدهند.
- فیلم آموزش اس کیو ال سرور – مقدماتی
- فیلم آموزش اس کیو ال سرور – تکمیلی
- فیلم آموزش اس کیو ال سرور – پیشرفته
اگر در زمینه کار با SQL حرفهای هستید، میتوانید از فیلمهای آموزشی سطح حرفهای برای افزایش مهارتهای خود نیز استفاده کنید.
- فیلم آموزش پروژه محور اس کیو ال سرور فرادرس – ساخت دیکشنری برای دیتابیس
- فیلم آموزش کوئری نویسی پیشرفته در SQL Server فرادرس
مثال هایی از دستور CASE در SQL
الان که با سینتکس این دستور و پارامترهای آن آشنا شدیم، برای درک بهتر روش کار دستور CASE در SQL باید مثالهایی را نیز بررسی کنیم. برای شروع از نمونههای ساده عبارت SELECT استفاده میکنیم. سپس هم مثالهای پیچیدهای درباره استفاده از دستور CASE برای «بروز رسانی» (Updating) و «حذف کردن» (Deleting) رکوردها را بررسی خواهیم کرد.
در این بخش با مثالهای معرفی شده در پایین کار خواهیم کرد.
- مثال سادهای درباره دستور CASE در SQL
- عبارتهای ساده CASE در SQL بهصورت جستوجو شده
- فیلتر کردن دادهها با استفاده از عبارتهای CASE در SQL
- جمعآوری دادهها با استفاده از عبارتهای CASE در SQL
- دستور CASE بهصورت تو در تو در SQL
- «تطابق چندگانه» (Multiple Matches) در عبارت CASE در SQL
- بهروزرسانی رکوردها با استفاده از عبارت CASE در SQL
- حذف کردن رکوردها با استفاده از عبارت CASE در SQL
مثال ساده ای درباره دستور CASE در SQL
عبارت ساده CASE برای تعیین نتیجه خروجی، شرایط مختلفی را در هر سطر از کوئری میسنجد. در این مثال عبارت SELECT را بهشکلی مینویسیم که دستور CASE برای مخفف کردن نام ایالتها، بر روی ستون state استفاده شود. به کد زیر توجه کنید.
1SELECT personID, [state],
2CASE [state]
3 WHEN 'Minnesota' THEN 'MN'
4 WHEN 'California' THEN 'CA'
5 WHEN 'Kentucky' THEN 'KY'
6END abbrev
7FROM #Temp_table
خروجی کد بالا بهصورت زیر قابل مشاهده است.
توجه کنید که در عبارت ساده CASE، فیلد مربوط به ایالت state به عنوان «نشانگر» (Expression) کوئری استفاده شده است. به این معنا که شرایط تعیین شده بر روی فیلد state ارزیابی خود را انجام میدهند. به این شکل از کوئریها، عبارت ساده CASE میگوییم. به این علت که برای این کوئری منطق پیچیدهای پیادهسازی نکردهایم. در واقع شرایط به شکلی تعریف نشدهاند که نیاز به بررسی بر روی دادههای سایر فیلدها نیز داشته باشند.
عبارت های ساده CASE در SQL به صورت جست وجو شده
بهصورتی که مدیران داده حرفهای تجربه کردهاند، استفاده از دستور CASE بهصورت جستوجو شده رایجتر از استفاده از عبارت ساده CASE است. زیرا این نوع از عبارتها معمولا از منطق شرطی پیچیدهتری نیز بهرهمند میشوند. دستور CASE بهصورت جستوجو شده از نشانگرهای Boolean برای تعیین نتیجه استفاده میکند.
به کد آمده پایین برای نمایش مثالی از عبارت CASE بهصورت جستوجو شده توجه کنید.
1SELECT personID, [state],
2CASE
3 WHEN [state] = 'Minnesota' THEN 'MN'
4 WHEN [state] = 'California' THEN 'CA'
5 WHEN [state] = 'Kentucky' THEN 'KY'
6END abbrev
7FROM #Temp_table
خروجی کد بالا بهصورت زیر قابل مشاهده است.
همانطور که در این عبارتهای ساده CASE میبینیم، با استفاده از عبارات CASE در SQL، محدودیتی برای ارزیابی شرایط در هر عبارت شامل CASE وجود ندارد. میتوانیم برای جستوجو فیلدهای مختلف نشانگرهای Boolean را در شرایط عبارت WHEN درج کنیم.
به کدی که در پایین برای نشان دادن مثال بالا زده شده توجه کنید.
1SELECT personID, [state],
2CASE
3 WHEN [state] = 'Minnesota' AND Income >= 100000 THEN 'MN'
4 WHEN [state] = 'California' THEN 'CA'
5 WHEN [state] = 'Kentucky' THEN 'KY'
6END abbrev
7FROM #Temp_table
اگر تلاش کنیم که تکه کد AND income >= 100000 را درون عبارت ساده CASE وارد کنیم، حتما با پیغام خطا روبهرو خواهیم شد.
فیلتر کردن داده ها با استفاده از عبارت های CASE در SQL
میتوانیم با استفاده از دستور CASE دادهها را درون بند WHERE از کوئری SQL فیلتر کنیم. در صورتی که بخواهید رکوردها را بر اساس شرایط منطقی محدود کنید، این گزینه بسیار مناسبی خواهد بود.
به کد زیر توجه کنید. در این کد مثالی از فیلتر کردن دادهها را با استفاده از دستور CASE پیادهسازی کردهایم.
1SELECT personID, lastName, firstName, [state]
2FROM #Temp_table
3where(
4CASE
5 WHEN [state] = 'Minnesota' AND Income >= 100000 THEN 'MN'
6 WHEN [state] = 'California' THEN 'CA'
7 WHEN [state] = 'Kentucky' THEN 'KY'
8END) = 'MN'
خروجی حاصل از اجرای کوئری بالا بهصورت زیر خواهد شد.
توجه کنید که وقتی از دستور CASE برای فیلتر کردن دادهها استفاده میکنیم، از آنجا که دادهها بهصورت یک ستون مجزا در کوئری برگشت داده نمیشوند، نباید به این عبارت، نام مستعار تخصیص داد.
برای فیلتر کردن دادهها از دستور CASE در بند HAVING نیز میتوان استفاده کرد. بعضی وقتها غیر منطقی است که از عبارت HAVING در کنار دستور CASE استفاده کنیم. زیرا لازم میشود که عبارت CASE را همراه با یکی از «توابع تجمعی» (Aggregate Functions) ترکیب کنیم.
به کدی که در ادامه با توجه به نکته بالا پیادهسازی شده توجه کنید.
1SELECT personID, lastName, firstName, [state]
2FROM #Temp_table
3GROUP BY personID, lastName, firstName, [state]
4HAVING max(CASE
5 WHEN income < 100000 THEN 1
6 WHEN income BETWEEN 100000 AND 199999 THEN 2
7 ELSE 3
8 END) > 1
همانطور که مشاهده میکنید، در کد بالا از دستور Between در SQL هم استفاده کردیم. خروجی حاصل از اجرای کوئری بالا بهصورت زیر است.
برای این مثال در کوئری بالا از تابع تجمعی max() همراه با بند HAVING استفاده کردهایم. اما استفاده کوئریها فقط محدود به این تابع نمیشود. در این مثال هر جا که شرط درون عبارت CASE برابر با 2 یا 3 شود کوئری رکوردها را بر میگرداند. زیرا ماده HAVING هر زمانی که شرط عبارت CASE مقدار 1 را بر گرداند، کوئریها را فیلتر میکند.
جمع آوری داده ها با استفاده از دستور CASE در SQL
یکی از روشهای پرطرفدار استفاده از دستور CASE در SQL در شمارش رکوردها است. مخصوصا در وقتهایی که استفاده از تابع count() به تنهایی برای شمارش کار آسانی نباشد. برای مثال فرض کنید که باید ردیف مجزایی را به عنوان مجموعه نتیجه عملیات بر گردانیم. این ردیف نمایانگر تعداد رکوردها درون هر ایالت است به شرطی که درآمد بیشتر یا مساوی 100000$ باشد.
کوئری مثال بالا را در کد زیر پیادهسازی کردهایم.
1select sum(CASE
2 WHEN [state] = 'Minnesota' and income >= 100000 THEN 1
3 ELSE 0
4 END) MN_counts,
5 sum(CASE WHEN [state] = 'California' and income >= 100000 THEN 1
6 ELSE 0
7 END) CA_counts,
8 sum(CASE WHEN [state] = 'Kentucky' and income >= 100000 THEN 1
9 ELSE 0
10 END) KY_counts
11from #temp_table
خروجی کوئری بالا را میتوانید در تصویر زیر ببینید.
با استفاده از تابع sum() درون عبارت تو در توی CASE میتوانیم بهطور موثری تعداد رکوردهای مورد نظرمان را بشماریم. در مثال بالا تعداد رکوردها را با توجه به نتیجه شرط تعیین شده شمارش کردیم. هر جا که شرط برقرار بود دستور CASE مقدار 1 و هر جا شرط برقرار نبود مقدار 0 بر میگرداند.
دستور CASE در SQL به صورت تو در تو
یکی از پیشرفتهترین موارد کاربرد دستور CASE در SQL استفاده از عبارت CASE بهصورت تو در تو با عبارت CASE دیگری است. به عنوان مثال، وقتی که «زیر شرطها»یی (Sub-Conditions) داریم که باید بعد از تایید شرط اصلی مورد ارزیابی قرار بگیرند.
به کد زیر نگاه کنید. در این کد مثالی از مورد گفته شده در بالا را پیادهسازی کردهایم.
1SELECT personID, lastName, firstName, [state],
2CASE
3 WHEN [state] = 'Minnesota'
4 THEN (CASE WHEN income > 100000 THEN 'over'
5 ELSE 'not over' END)
6 WHEN [state] = 'California'
7THEN (CASE WHEN income > 150000 THEN 'over'
8 ELSE 'not over' END)
9 WHEN [state] = 'Kentucky'
10THEN (CASE WHEN income > 75000 THEN 'over'
11 ELSE 'not over' END)
12END over_income
13FROM #Temp_table
خروجی کوئری بالا بهصورت زیر قابل مشاهده است.
در مثال بالا درباره دستور CASE بهصورت تو در تو، پایگاه داده در ابتدا فیلد مربوط به ایالتها state را بررسی میکند. اگر این بررسی مقدار True برگرداند به سراغ ارزیابی زیر شرط تعیین شده میرود. برای مثال، وقتی که سیستم رکوردهایی را ارزیابی میکند که در آنها مقدار داده درون ستون ایالتها state برابر با Minnesota باشد، دو رکورد با مقدار True بر گشت داده میشوند. این کوئری برای آن دو رکورد شرط درآمد را ارزیابی میکند تا داده خروجی را در ستون over_income تعیین کند.
در صورتی که نسبت به SQL مبتدی هستید و قصد دارید با این برنامه بیشتر آشنا شوید در سایت فرادرس فیلم آموزشی رایگانی برای استفاده شما فراهم شده است. در این فیلم آموزشی رایگان کار با پایگاه داده SQL را بر روی ادیتور آنلاین تمرین میکنیم.
تطابق چندگانه در عبارت CASE در SQL
اگر از عبارت CASE که نوشتیم دادههای غیر منتظرهای را به عنوان خروجی دریافت کنیم، باید منطق طراحی شده را دوباره بررسی کنیم تا از بابت برداشت تطابق چندگانه کوئری مطمئن شویم. وقتی موقعیتی استثنایی پیش بیاید که بیش از یک شرط بتوانند بهصورت همزمان مقدار True را برگردانند، پایگاه داده همیشه نتیجه اولین شرطی که مقدار True بر گردانده را محاسبه میکند و باقی شرطها را نادیده میگیرد.
به کد پایین توجه کنید. در این کوئری، مثالی از وضعیت بالا را شبیهسازی کردهایم.
1select lastName, [state], income,
2CASE
3 WHEN income > 50000 THEN 'greater than 50,000'
4 WHEN income > 100000 THEN 'greater than 100,000'
5 Else 'Income less than 50,000'
6end incomeCategory
7from #temp_table
خروجی کوئری بالا بر روی پایگاه داده فرضی خودمان بهصورت زیر میشود.
در این مثال توجه کنید که چگونه هر دستهبندی درآمدی incomeCategory بزرگتر از 50000$ است حتی با اینکه مقادیر درآمدی بزرگتر از 100000$ نیز وجود دارند. بنابراین اولین شرط درون عبارت CASE برای هر مقدار درآمدی برقرار خواهد بود و شرایط دیگر هرگز ارزیابی نخواهند شد. بنابراین، در این کوئری هیچ وقت خروجی با درآمد بیش از 100000$ را بدست نخواهیم آورد.
به روز رسانی رکوردها با استفاده از عبارت CASE در SQL
دستور CASE میتواند در کوئریها همراه با عبارتهای دیگری نیز به غیر از عبارت SELECT در SQL جای بگیرد. از این دستورات برای بهروزرسانی دادهها نیز میتوان استفاده کرد.
به مثال زیر توجه کنید. در این مثال نمونهای از بهروزرسانی دادهها با استفاده از دستور CASE را مشاهده میکنیم.
1UPDATE #temp_table
2set [state] = CASE
3 WHEN [state] = 'Minnesota' THEN 'MN'
4 WHEN [state] = 'California' Then 'CA'
5 WHEN [state] = 'Kentucky' Then 'KY'
6 END
خروجی کوئری بالا بر روی پایگاه داده ساخته شده در ابتدای مطلب بهصورت زیر میشود.
در زمان بهروزرسانی رکوردها، بر اساس شرایطی که در عبارت CASE تعیین شده، مقدار مورد نظر برای بهروزرسانی تنظیم میشود.
البته که میتوانیم رکوردها را بر اساس دادههایی که توسط عبارت CASE فیلتر میشوند نیز بهروزرسانی کنیم. برای اینکه مثالی در این باره ببینید به کوئری پیادهسازی شده پایین توجه کنید.
1update #temp_table
2set income = null
3WHERE (CASE
4 WHEN [state] = 'MN' and firstname = 'Oliver' THEN 1
5 ELSE 0
6 END ) = 1
خروجی کوئری بالا نیز بر روی پایگاه داده ساخته شده در ابتدای مطلب بهصورت زیر میشود.
در مثال بالا عبارت CASE هر وقت که شرط برابر با True باشد مقدار 1 بر میگرداند. و ماده WHERE همه چیز را بهجز سطرهایی که نتیجهشان برابر 1 باشد را فیلتر میکند. برای اینکه فقط آن سطرها باید بهروزرسانی شوند.
حذف کردن رکوردها با استفاده از دستور CASE در SQL
همانطور که از دستور CASE برای بهروزرسانی دادهها استفاده کردیم، میتوانیم از این عبارت با استفاده از فیلتر کردن برای تعیین اینکه کدام رکوردها باید حذف شوند نیز استفاده کنیم.
به کوئری که در پایین پیادهسازی شده توجه کنید.
1DELETE FROM #temp_table
2WHERE (CASE
3 WHEN [state] = 'MN' and firstname = 'Oliver' THEN 1
4 WHEN [state] = 'CA' and firstname = 'Kristen' Then 2
5 ELSE 0
6 END ) = 1
خروجی کوئری بالا بهصورت زیر است.
بعضی وقتها استفاده از عبارت CASE در بند WHERE یا بند HAVING از کوئری برای اجرای عملیات مربوط به «فیتر کردن» (Filtering) ممکن است با دردسر و مشکل همراه باشد. اما این کار در زمانهایی که نیاز به بررسی شرایط تو در تو داریم -برای مثال قبل از عملیات «حذف کردن» (Deleting) یا «بهروزرسانی» (Updating) هر ردیف- میتواند بسیار مفید نیز باشد. قبل از طراحی هر کوئری باید به عملیاتی که قرار است انجام شود فکر کرد.
آموزش های تکمیلی مربوط به SQL
در ادامه دو مورد از فیلمهای آموزشی تکمیلی، مربوط به کار با پایگاه داده SQL Server را معرفی کردهایم. این آموزشها توسط فرادرس در دو سطح مختلف مهارتی، با جزییات کامل و بهترین کیفیت ممکن ارائه شدهاند. با بررسی و تمرین این فیلمهای آموزشی از فرادرس، میتوانیم مهارتهای خودمان را تا سطح بسیار خوبی ارتقا بدهیم.
- فیلم رایگان آموزش آشنایی با View و پیاده سازی آن در SQL Server فرادرس
- فیلم آموزش استفاده از JSON در اس کیو ال فرادرس
جمع بندی
در این مطلب از مجله فرادرس، سینتکس و پارامترهای عبارت CASE را بررسی کردیم. سپس چندین مثال مختلف را مطالعه کردیم، که روش دقیق استفاده از دستور CASE در SQL را نشان میدادند. شناخت نحوه استفاده صحیح از عبارت CASE با استفاده از تکنیکهای چندکاره، تواناییمان را در کار با دادهها تقویت میکند. میتوانیم برای هر عملیاتی مانند انتخاب کردن، وارد کردن، بهروزرسانی یا حذف دادهها که بخواهیم انجام دهیم از دستور CASE در SQL استفاده کنیم. از این دستور برای ارزیابی شرایط مختلف ممکن و بر گرداندن نتیجه وابسته به هر کدام از شرطها استفاده میشود.
دستور CASE همیشه شامل کلمات کلیدی WHEN و THEN میشود. اولین شرطی که برای درست بودن بررسی میشود بر اساس هر حکمی که بعد از کلمه کلیدی THEN آمده نتیجه را بر میگرداند. بعد از آن بقیه شرطها نادیده گرفته میشوند.
در تکمیل این مطلب از مجله فرادرس باید اشاره کنیم که برای تسلط به پایگاههای داده و مبحث SQL باید تمرین کرد. اگر که در جستوجوی شغلی در رشته تحلیلگر داده هستیم این تمرین کردن یکی از بهترین کارهایی است که میتوان انجام داد. SQL بیش از چهل سال است که وجود دارد و در سراسر جهان بهکار برده میشود و هنوز هم یکی از محبوبترین زبانهای برنامهنویسی در حوزه کار با دادهها است.