Əgər artıq CASE ilə tanışsanız, logikanı birbaşa sorğuya yerləşdirməyin yoludur. Amma çoxları bilmir ki, CASE-in iki forması var. CASE WHEN ... — bu, if-else tipli şərtlərin yoxlanılmasıdır, sadə CASE isə başqa dillərdəki switch-case kimidir: bir ifadəni bir neçə dəyərlə müqayisə edir və uyğun bloku icra edir.
Bir sahəni sabit dəyərlərlə müqayisə edəndə daha kompakt və intuitiv görünür.
Sadə CASE-in sintaksisi
CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE default_result
END
Hər şey sadədir:
expression— müqayisə olunan ifadə və ya sahə,value1,value2və s. ilə yoxlanılır.THEN— uyğunluq olduqda nə qaytarılacağını göstərir.ELSE— heç biri uyğun gəlməsə nə qaytarılacaq (buraxmaq olar, amma yaxşı deyil).
Nümunə: Tələbələrin qiymətləri
Tutaq ki, students cədvəlində grade sütunu var, orada 2-dən 5-ə qədər tam ədəd saxlanılır. Biz qiymətlərin mətn interpretasiyasını göstərmək istəyirik.
SELECT
name,
grade,
CASE grade
WHEN 5 THEN 'Əla'
WHEN 4 THEN 'Yaxşı'
WHEN 3 THEN 'Qənaətbəxş'
WHEN 2 THEN 'Qeyri-qənaətbəxş'
ELSE 'Naməlum'
END AS qiymet_sozle
FROM students;
Burada CASE grade sahəsinin dəyərini 2, 3, 4, 5 sabitləri ilə müqayisə edir.
Nümunə: Məhsul kateqoriyaları kodla
products cədvəlində category_code sahəsi var, orada qısa etiketlər saxlanılır: 'el', 'frn', 'bks' və s. Biz oxunaqlı kateqoriya adını göstərmək istəyirik.
SELECT
product_name,
category_code,
CASE category_code
WHEN 'el' THEN 'Elektronika'
WHEN 'frn' THEN 'Mebel'
WHEN 'bks' THEN 'Kitablar'
ELSE 'Digər'
END AS category_name
FROM products;
Bu üsul xüsusilə kod əvəzinə "insan" mətni göstərmək lazım olanda rahatdır.
Nümunə: Ay adları
Bəzən ayların adını nömrə ilə mətn kimi göstərmək istəyirik:
SELECT
EXTRACT(MONTH FROM order_date) AS month_number,
CASE EXTRACT(MONTH FROM order_date)
WHEN 1 THEN 'Yanvar'
WHEN 2 THEN 'Fevral'
WHEN 3 THEN 'Mart'
WHEN 4 THEN 'Aprel'
WHEN 5 THEN 'May'
WHEN 6 THEN 'İyun'
WHEN 7 THEN 'İyul'
WHEN 8 THEN 'Avqust'
WHEN 9 THEN 'Sentyabr'
WHEN 10 THEN 'Oktyabr'
WHEN 11 THEN 'Noyabr'
WHEN 12 THEN 'Dekabr'
ELSE 'Naməlum'
END AS month_name
FROM orders;
Burada sadə CASE 1-dən 12-yə qədər olan ədədləri aydın şəkildə mətnə çevirir.
Sadə CASE-də NULL ilə işləmək
Vacibdir ki, əgər dəyər NULL ilə müqayisə olunursa, nəticə NULL olacaq, çünki NULL = NULL — doğru deyil, naməlumdur.
NULL ilə nümunə:
SELECT
user_id,
status,
CASE status
WHEN 'active' THEN 'Aktiv'
WHEN 'blocked' THEN 'Bloklanıb'
WHEN NULL THEN 'Status yoxdur' -- işləməyəcək!
ELSE 'Naməlum'
END AS user_state
FROM users;
WHEN NULL əvəzinə ELSE istifadə etmək lazımdır, ya da sadəcə search CASE (keçən dərsdə baxmışdıq) tətbiq et:
CASE
WHEN status IS NULL THEN 'Status yoxdur'
...
Search CASE ilə müqayisə
| Xüsusiyyət | Sadə CASE | Search CASE |
|---|---|---|
| Konkret dəyərlərlə müqayisə | ✅ Rahatdır | ❌ Uyğun deyil |
| Şərtlərin elastikliyi (>, IS NULL) | ❌ Olmaz | ✅ Olar |
| Proqramlaşdırmada analoqu | switch-case |
if-else |
Praktik case-lər
Nümunə: Sorğunun statusunun vizuallaşdırılması
| request_id | status |
|---|---|
| 101 | new |
| 102 | in_progress |
| 103 | done |
| 104 | cancelled |
| 105 | NULL |
SELECT
request_id,
CASE status
WHEN 'new' THEN '🟡 Yeni'
WHEN 'in_progress' THEN '🔵 İşdə'
WHEN 'done' THEN '🟢 Bitdi'
ELSE '⚪ Naməlum'
END AS status_label
FROM requests;
| request_id | status_label |
|---|---|
| 101 | 🟡 Yeni |
| 102 | 🔵 İşdə |
| 103 | 🟢 Bitdi |
| 104 | ⚪ Naməlum |
| 105 | ⚪ Naməlum |
Burada CASE tərcüməçi kimi işləyir: texniki statusları başa düşülən (və hətta şirin) etiketlərə çevirir. Əgər status naməlum və ya NULL-dursa — istifadəçi ⚪ «Naməlum» alacaq.
Nümunə: Hesabat üçün kateqoriyalara görə qruplaşdırma
| employee_id | name | department |
|---|---|---|
| 1 | Alex Lin | HR |
| 2 | Maria Chi | IT |
| 3 | Anna Song | IT |
| 4 | Otto Art | FIN |
| 5 | Jane Doe | HR |
| 6 | Max Gray | SALES |
| 7 | Zoe Black | IT |
| 8 | Tom Brown | FIN |
| 9 | Liam Park | NULL |
| 10 | Eva Gold | HR |
SELECT
CASE department
WHEN 'HR' THEN 'Kadrlar'
WHEN 'IT' THEN 'Texnologiyalar'
WHEN 'FIN' THEN 'Maliyyə'
ELSE 'Digər'
END AS dept_name,
COUNT(*) AS staff_count
FROM employees
GROUP BY
CASE department
WHEN 'HR' THEN 'Kadrlar'
WHEN 'IT' THEN 'Texnologiyalar'
WHEN 'FIN' THEN 'Maliyyə'
ELSE 'Digər'
END;
Nəticə:
| dept_name | staff_count |
|---|---|
| Kadrlar | 3 |
| Texnologiyalar | 3 |
| Maliyyə | 2 |
| Digər | 2 |
Burada nə baş verir:
- HR departamentindən olanlar Kadrlar kateqoriyasına düşür.
- IT — Texnologiyalar olur.
- FIN — Maliyyə olur.
- Qalan hər şey, o cümlədən SALES və NULL, Digər-ə düşür. Bu yanaşma dostcasına və başa düşülən hesabatlar üçün əladır.
Yayılmış səhvlər
ELSEunutmaq → əgər heç bir dəyər uyğun gəlməsəNULLalırsan.NULLilə müqayisə edirsən → işləmir,IS NULLvə searchCASEistifadə et.- Uyğunsuz tipləri müqayisə edirsən → məsələn,
CASE grade WHEN '5'əgərgraderəqəmdir.
Sadə CASE — bir dəyəri mümkün variantlarla müqayisə etmək lazım olanda sənin alətindir. Kompakt, oxunaqlıdır və xüsusilə mətn təsnifatı, vizuallaşdırma, kodların çevrilməsi və rahat qruplaşdırma üçün faydalıdır.
Əgər diapazonları, NULL-u və ya daha mürəkkəb şərtləri yoxlamaq lazımdırsa — search CASE istifadə et. SQL aydınlığı sevir. CASE isə bu aydınlığa forma vermək üçün sənin alətindir.
GO TO FULL VERSION