CodeGym /Kurslar /SQL SELF /Şərti ifadələr: CASE <ifade> WHEN ... THEN ....

Şərti ifadələr: CASE <ifade> WHEN ... THEN ... ELSE ... END

SQL SELF
Səviyyə, Dərs
Mövcuddur

Ə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, value2 və 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

  • ELSE unutmaq → əgər heç bir dəyər uyğun gəlməsə NULL alırsan.
  • NULL ilə müqayisə edirsən → işləmir, IS NULL və search CASE istifadə et.
  • Uyğunsuz tipləri müqayisə edirsən → məsələn, CASE grade WHEN '5' əgər grade rə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.

2
Tapşırıq
SQL SELF, səviyyə, dərs
Bağlanıb
Qiymətlərə mətn təsvirlərinin verilməsi
Qiymətlərə mətn təsvirlərinin verilməsi
2
Tapşırıq
SQL SELF, səviyyə, dərs
Bağlanıb
Məhsul kateqoriyalarının müqayisəsi
Məhsul kateqoriyalarının müqayisəsi
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION