যখন আপনি একটি ডেটাবেসের সাথে কাজ করেন, তখন আপনি আপনার কোয়েরিতে একটি if/then অপারেশন চালাতে চাইতে পারেন। উদাহরণস্বরূপ, আপনি কর্মীদের তালিকায় যারা এক বছরের বেশি কাজ করেছে তাদের প্রোবেশন স্ট্যাটাস পরিবর্তন করতে চাইতে পারেন। অথবা আপনি একটি লিডারবোর্ডের খেলোয়াড়দের তালিকায় যারা টপ থ্রীয়ে র্যাঙ্ক করেছে তাদের বিজয়ী হিসেবে চিহ্নিত করতে চাইতে পারেন।
SQL-এ এই অপারেশনগুলো চালাতে হলে আপনাকে CASE স্টেটমেন্ট ব্যবহার করতে হবে। SQL CASE স্টেটমেন্ট আপনাকে if/then অপারেশন চালাতে দেয়, মাইক্রোসফট এক্সেলে if/then প্রসিডিউর চালানো যেভাবে হয়।
এই গাইডে আমরা SQL CASE স্টেটমেন্টের মূলভূত বিষয়গুলো ভাঙে আলোচনা করব, এবং আপনি কীভাবে আপনার কোয়েরিতে এটি ব্যবহার করতে পারেন সেটি আলোচনা করব। আমরা একাধিক SQL CASE স্টেটমেন্ট কীভাবে ব্যবহার করতে হয় এবং CASE কীভাবে অ্যাগ্রিগেট ফাংশনসহ ব্যবহার করা যায় সেটিও অন্বেষণ করব।
কোয়েরি রিফ্রেশার
একটি ডেটাবেস থেকে তথ্য পুনরুদ্ধার করতে আপনাকে একটি কোয়েরি লিখতে হয়। কোয়েরি σχεদাই SELECT স্টেটমেন্ট দিয়ে শুরু হয়, যা ডেটাবেসকে বলে কোয়েরি কোন কলামগুলো ফেরত দেবে। কোয়েরিতে সাধারণত একটি FROM ক্লজ থাকে, যা ডেটাবেসকে বলে অপারেশন কোন টেবিলে সার্চ করবে।
এখানে SQL-এ একটি কোয়েরির সিনট্যাক্স:
SELECT column_name FROM table_name WHERE conditions_are_met;
চলুন একটি উদাহরণ দিয়ে বুঝি। এখানে একটি কোয়েরি যা আমাদের employees টেবিলের সকল কর্মীর নাম ফেরত দেবে:
SELECT name FROM employees;
আমাদের কোয়েরি নিচের ফলাফল ফেরত দেয়:
| name |
| Luke Mike Hannah Geoff Alexis Emma Jonah Adam |
(৮ সারি)
যদি আমরা একাধিক কলাম পুনরুদ্ধার করতে চাই, তবে কলামের নামগুলো কমা দিয়ে আলাদা করতে পারি। অথবা যদি সকল কলামের তথ্য চাই, তবে এস্টারিস্ক (*) অপারেটর ব্যবহার করতে পারি, যা একটি SQL টেবিলের সকল কলামকে প্রতীক বোঝায়।
অতিরিক্তভাবে, যদি আমরা নির্দিষ্ট শর্তের ভিত্তিতে রেকর্ড ফিল্টার করতে চাই, তবে WHERE ক্লজ ব্যবহার করতে পারি। এখানে একটি উদাহরণ যা একটি কোম্পানির আলবানি শাখায় কাজ করা সকল কর্মীর নাম খুঁজে বের করে:
SELECT name FROM employees WHERE branch = 'Albany';
আমাদের কোয়েরির ফলাফল:
| name |
| Emma Jonah |
(২ সারি)
এই সব কমপ্লেক্স কোয়েরি। কিন্তু যদি আমরা কোয়েরি চালানোর সময় একটি if/then অপারেশন করতে চাই? সেটাই যেখানে SQL CASE স্টেটমেন্ট সহায়ক হয়।
SQL CASE
CASE স্টেটমেন্ট SQL-এ if/then লজিক ডিফাইন করতে ব্যবহার করা যায়। উদাহরণস্বরূপ, যদি আমরা পাঁচ বা ততোধিক বছর কাজ করা সকল কর্মীর বেতন বাড়াতে চাই, তবে আমরা CASE স্টেটমেন্ট ব্যবহার করতে পারি।
এখানে SQL CASE স্টেটমেন্টের সিনট্যাক্স:
SELECT column1_name CASE WHEN column2_name = 'X' THEN 'Y' ELSE NULL END AS column3_name FROM table_name;
এই কোয়েরিতে অনেক কিছু হচ্ছে, তাই চলুন একটি উদাহরণ দিয়ে বুঝি। ধরুন আমরা যাদের পাঁচটির বেশি employee of the month পুরস্কার আছে তাদের ২০০ ডলার বেতন বৃদ্ধি দিতে চাই। এখানে একটি SQL স্টেটমেন্ট যা এই লক্ষ্য পূরণ করতে পারে:
SELECT name, CASE WHEN employee_month_awards > 5 THEN 200 ELSE NULL END AS pending_raise FROM employees;
আমাদের কোয়েরি আমাদের সার্চড কেস এক্সপ্রেশন থেকে নিচের ফলাফল ফেরত দেয়:
| name | pending_raise |
| Luke | |
| Mike | |
| Hannah | |
| Geoff | |
| Alexis | |
| Emma | 200 |
| Jonah | |
| Adam | 200 |
(৮ সারি)
চলুন এটি ভাঙে বুঝি। CASE স্টেটমেন্ট প্রতিটি রেকর্ড চেক করে এবং মূল্যায়ন করে শর্তসাপেক্ষ স্টেটমেন্ট, employee month awards > 5, সত্য কিনা। যদি শর্তসাপেক্ষ স্টেটমেন্ট সত্য হয়, তবে pending_raise কলামে 200 মান প্রিন্ট হবে। যেখানে শর্তসাপেক্ষ স্টেটমেন্ট মিথ্যা, সেখানে নাল মান থাকবে।
শেষে, আমাদের কোয়েরি কর্মীদের নামের তালিকা এবং যাদের বেতন বৃদ্ধি বাকি সেটি ফেরত দেয়।
গুরুত্বপূর্ণ যে, SQL CASE স্টেটমেন্ট আমাদের টেবিলে নতুন কলাম যোগ করে না। বরং এটি আমাদের SELECT কোয়েরির আউটপুট-এ একটি কলাম তৈরি করে, যাতে আমরা দেখতে পাই কারা বেতন বৃদ্ধির যোগ্য।
অতিরিক্তভাবে, যদি আমরা চাই যারা বেতন বৃদ্ধির যোগ্য নही তাদের 0 পেন্ডিং রেইজ দেওয়া হোক, তবে আমরা ELSE স্টেটমেন্টে NULL-এর বদলে 0 নির্দিষ্ট করতে পারি। আমরা ORDER BY ক্লজও ব্যবহার করতে পারি আমাদের ডেটা নির্দিষ্ট ক্রমে দেখতে চাইলে।
SQL CASE এবং একাধিক শর্ত
CASE স্টেটমেন্ট একই কোয়েরিতে একাধিকবার ব্যবহার করা যায়। যদি আমরা তিন বা ততোধিক পুরস্কার পাওয়া সকল কর্মীর ৫০ ডলার এবং পাঁচ বা ততোধিক পুরস্কার পাওয়া সকল কর্মীর ২০০ ডলার বেতন বৃদ্ধি দিতে চাই, তবে আমরা নিচের স্টেটমেন্ট ব্যবহার করতে পারি:
SELECT name, CASE WHEN employee_month_awards > 5 THEN 200 WHEN employee_month_awards > 3 THEN 50 ELSE 0 END AS pending_raise FROM employees;
আমাদের কোয়েরির আউটপুট নিচের মতো:
| name | pending_raise |
| Luke | 50 |
| Mike | |
| Hannah | |
| Geoff | |
| Alexis | |
| Emma | 200 |
| Jonah | 50 |
| Adam | 200 |
(৮ সারি)
আমাদের উদাহরণে, CASE স্টেটমেন্টগুলো যেই ক্রমে লেখা হয়েছে সেই ক্রমে মূল্যায়ন হবে।
সুতরাং, আমাদের কোয়েরি প্রথমে যাদের পাঁচটির বেশি পুরস্কার আছে তাদের চেক করে এবং তাদের পেন্ডিং রেইজ 200 সেট করে। তারপর, আমাদের কোয়েরি যাদের তিনটির বেশি পুরস্কার আছে তাদের চেক করে এবং তাদের পেন্ডিং রেইজ 50 সেট করে। চূড়ান্তে, যদি একজন কর্মী যেকোনো মাপদণ্ড পূরণ না করে, তবে তাদের পেন্ডিং রেইজ 0 সেট হবে।
তবে, এই কোডটি আরও দক্ষ হতে পারে। স্টেটমেন্টগুলো নির্দিষ্ট ক্রমে লিখে প্রোগ্রাম চলে এমনভাবে না লিখে, আমাদের ওভারল্যাপ না করে এমন স্টেটমেন্ট লিখা উচিত। এখানে একটি উদাহরণ কোয়েরি যা উপরের মতোই কাজ করে, কিন্তু কর্মী কতটি পুরস্কার পেয়েছে সেটি চেক করতে AND স্টেটমেন্ট ব্যবহার করে:
SELECT name, CASE WHEN employee_month_awards >= 3 AND employee_month_awards <= 5 THEN 50 WHEN employee_month_awards > 5 THEN 200 ELSE 0 END AS pending_raise FROM employees;
আমাদের কোয়েরি উপরের কোয়েরির মতোই ফলাফল ফেরত দেয়। তবে, এটি CASE স্টেটমেন্টের ক্রমের ওপর নির্ভর করে না, অর্থাৎ ভুলভাবে স্টেটমেন্ট রাখলে ভুল হওয়ার সম্ভাবনা কম।
SQL CASE এবং অ্যাগ্রিগেট ফাংশন
আপনি CASE-কে অ্যাগ্রিগেট ফাংশনসহও ব্যবহার করতে পারেন। এটি উপযোগী হয় যদি আপনি শুধু সেই সারিগুলো গণনা করতে চান যা নির্দিষ্ট শর্ত পূরণ করে। উদাহরণস্বরূপ, আপনি জানতে চান কতজন কর্মী ২০০ ডলার বোনাস পেয়েছে, তবে আপনি CASE অ্যাগ্রিগেট ফাংশনসহ ব্যবহার করতে পারেন।
এখানে CASE অ্যাগ্রিগেট ফাংশনসহ ব্যবহারের সিনট্যাক্স:
SELECT column1_name CASE WHEN column2_name = 'X' THEN 'Y' ELSE NULL END AS column3_name, COUNT(1) AS count FROM table_name GROUP BY column3_name;
চলুন একটি উদাহরণ দিয়ে বুঝি। ধরুন আমরা জানতে চাই কতজন কর্মী ৫০ ডলার বা ততোধিক বোনাসের যোগ্য। আমরা নিচের কোয়েরি ব্যবহার করে এই তথ্য পেতে পারি:
SELECT CASE WHEN employee_month_awards >= 3 AND employee_month_awards <= 5 THEN 50 WHEN employee_month_awards > 5 THEN 200 ELSE 0 END AS pending_raise, COUNT(1) AS count FROM employees GROUP BY pending_raise;
আমাদের কোয়েরি নিচের ফলাফল ফেরত দেয়:
| pending_raise | count |
| 50 | 3 |
| 3 | |
| 200 | 2 |
আপনি দেখতে পাচ্ছেন, আমাদের কোয়েরি কর্মীদের অর্জিত পেন্ডিং রেইজের তালিকা এবং প্রতিটি ধরনের রেইজ কতজন কর্মীর বাকি সেটি ফেরত দিয়েছে। এই কেসে, তিনজন কর্মী ৫০ ডলার রেইজের যোগ্য, তিনজন কর্মী কোন রেইজ পাবেন না, এবং দুজন কর্মী ২০০ ডলার রেইজের যোগ্য।
উপসংহার
এই টিউটোরিয়ালে আমরা SQL সার্ভার CASE স্টেটমেন্টের মূলভূত বিষয়গুলো ভাঙে আলোচনা করেছি এবং কীভাবে এটি আমাদের কোয়েরিতে if/then লজিক বাস্তবায়ন করতে ব্যবহার করা যায় সেটি আলোচনা করেছি। আমরা একাধিক শর্তের সাথে CASE কীভাবে ব্যবহার করতে হয় এবং অ্যাগ্রিগেট ফাংশনসহ কীভাবে ব্যবহার করা যায় সেটিও আলোচনা করেছি।
স্মরণের तौर पर, প্রতিটি সিম্পল CASE এক্সপ্রেশন এই নিয়মগুলো মেনে চলা উচিত:
CASEস্টেটমেন্টSELECTক্লজে থাকা উচিত;CASEস্টেটমেন্টেWHEN,THEN, এবংENDকম্পোনেন্ট থাকা উচিত;- একাধিক
WHENস্টেটমেন্ট এবংELSEক্লজ ঐচ্ছিকভাবে ব্যবহার করা যায়; WHENএবংTHENক্লজের মাঝপথেANDবাORমতো শর্তসাপেক্ষ স্টেটমেন্ট ব্যবহার করা যায়।
এখন আপনি CASE স্টেটমেন্ট একজন SQL প্রফেশনালের মতো ব্যবহার করতে পারবেন!