SQL CASE WHEN, bir sorgudaki değeri veya koşulu kontrol ederek farklı sonuçlar üretmek için kullanılır. Böylece notları başarı durumuna, sipariş tutarlarını kategoriye, stok seviyelerini uyarı sınıfına veya kullanıcı durumlarını açıklayıcı metinlere dönüştürebilirsiniz.
CASE yapısını öğrenirken iki temel noktaya odaklanın: hangi karşılaştırmanın yapılacağı ve koşulların hangi sırayla değerlendirileceği. SQL temellerini programlama mantığıyla birlikte tekrar etmek isteyenler için asenkron video eğitimler de ek bir öğrenme seçeneği olabilir.
SQL CASE WHEN Nedir ve Hangi Durumlarda Kullanılır?
CASE, SQL içinde koşullu değer üretmeye yarayan bir ifadedir. Bir sütunun mevcut değerini değiştirmez; sorgu sonucunda yeni bir sütun veya hesaplanmış bir sonuç oluşturur. Bu nedenle raporlama sorgularında ham veriyi daha anlaşılır hâle getirmek için sık kullanılır.
Örneğin sayısal notları “Başarılı”, “Geliştirilmeli” ve “Başarısız” gibi metinlere dönüştürebilir veya sipariş toplamlarını “Düşük”, “Orta” ve “Yüksek” kategorilerine ayırabilirsiniz. CASE ifadesi genellikle SELECT içinde görülse de ilerleyen bölümlerde ORDER BY ve GROUP BY ile de kullanılabilir.
Basit CASE ve aramalı CASE arasındaki fark
Basit CASE, tek bir ifadeyi sabit değerlerle karşılaştırır. Aşağıdaki örnekte durum sütununun değerine göre açıklama üretilir:
SELECT
durum,
CASE durum
WHEN 'A' THEN 'Aktif'
WHEN 'P' THEN 'Pasif'
ELSE 'Bilinmiyor'
END AS durum_aciklamasi
FROM kullanicilar;
Aramalı CASE ise farklı Boolean koşulları değerlendirir. Karşılaştırma tek bir sütunla sınırlı değildir; aralık, birden fazla sütun veya IS NULL gibi kontroller kullanılabilir:
SELECT
ogrenci_adi,
puan,
CASE
WHEN puan >= 85 THEN 'Çok iyi'
WHEN puan >= 60 THEN 'Geçti'
ELSE 'Kaldı'
END AS sonuc
FROM sinavlar;
İlk örnekte her WHEN değeri durum ifadesiyle karşılaştırılır. İkinci örnekte ise her koşul ayrı ayrı değerlendirilir. Not sınıflandırması, stok seviyesi veya sipariş tutarı gibi aralıklarla çalışılan durumlarda aramalı CASE daha uygundur.
| Kullanım amacı | Karşılaştırma mantığı | Örnek kullanım | Dikkat edilmesi gereken nokta |
|---|---|---|---|
| Basit CASE | Tek ifade, sabit değerlerle karşılaştırılır | Durum kodunu açıklamaya çevirme | Aralık koşulları için uygun değildir |
| Aramalı CASE | Bağımsız Boolean koşullar incelenir | Not veya tutar aralığı sınıflandırma | Koşulların sırası sonucu etkiler |
WHEN Koşulları Hangi Sırayla Değerlendirilir?

CASE içindeki WHEN koşulları yukarıdan aşağıya incelenir. SQL, doğru olan ilk koşulun THEN sonucunu döndürür ve sonraki koşulları değerlendirmeyi bırakır. Bu yüzden geniş bir koşulu, daha özel koşullardan önce yazmak hatalı sınıflandırmaya yol açabilir.
SELECT
puan,
CASE
WHEN puan >= 50 THEN 'Geçti'
WHEN puan >= 85 THEN 'Çok iyi'
ELSE 'Kaldı'
END AS kategori
FROM sinavlar;
Bu örnekte 90 puan alan öğrenci “Çok iyi” yerine “Geçti” sonucunu alır; çünkü puan >= 50 koşulu önce doğru olur. Daha özel aralıkları önce yazmak gerekir. Ayrıca üç kontrol sorusunu her CASE ifadesinden önce uygulayın:
- Koşullar birbiriyle çakışıyor mu?
- Sınır değer hangi dala gitmeli?
NULLgeldiğinde beklenen sonuç ne?
ELSE yazılmazsa hiçbir WHEN koşuluna uymayan satırlar için sonuç NULL olabilir. Raporlarda bu durum belirsiz veya eksik görünen kategoriler oluşturabilir. Bu nedenle bilinmeyen durumlar için ELSE 'Tanımsız' gibi açık bir varsayılan sonuç vermek çoğu zaman daha güvenlidir.
NULL kontrolünde eşittir operatörü kullanılmaz. alan = NULL beklenen sonucu vermez; bunun yerine alan IS NULL veya alan IS NOT NULL yazılır:
SELECT
urun_adi,
CASE
WHEN stok IS NULL THEN 'Stok bilgisi yok'
WHEN stok = 0 THEN 'Tükendi'
ELSE 'Stokta'
END AS stok_durumu
FROM urunler;
CASE WHEN ile SELECT İçinde Değer ve Not Kategorisi Üretme
CASE, SELECT içinde her satır için yeni ve sanal bir sonuç sütunu üretir. Kaynak tablodaki not değeri değiştirilmez; sorgu çalıştığında notun karşısında koşula göre “başarılı”, “destek gerekli” veya “başarısız” gibi bir kategori gösterilir. Aşağıdaki aralıklar belirli bir kurumun resmi sınav sistemi değil, konuyu açıklamak için hazırlanmış örnek bir sınıflandırmadır.
| Not aralığı | Kategori | Örnek sınır davranışı |
|---|---|---|
| 85 ve üzeri | Başarılı | 85 başarılıdır |
| 60–84 | Destek gerekli | 60 destek gerekli kabul edilir |
| 0–59 | Başarısız | 59 başarısızdır |
SELECT
ogrenci_adi,
notu,
CASE
WHEN notu >= 85 THEN 'Başarılı'
WHEN notu >= 60 THEN 'Destek gerekli'
WHEN notu >= 0 THEN 'Başarısız'
ELSE 'Geçersiz not'
END AS not_kategorisi
FROM ogrenciler;
Sorguyu incelerken üç noktaya dikkat edilebilir:
- Önce
ogrenci_adivenotugibi kaynak sütunlar seçilir. WHENkoşulları yukarıdan aşağıya değerlendirilir. Bir öğrenci 90 aldıysa ilk koşul sağlanır ve sonuç “Başarılı” olur; sonraki koşullara geçilmez.ELSE, hiçbir koşul karşılanmadığında kullanılacak varsayılan sonucu belirler. Bu örnekte negatif, hatalı veya beklenmeyen değerler “Geçersiz not” olarak işaretlenir.
Not değeri NULL ise normal karşılaştırmalar doğru sonuç üretmez ve satır genellikle ELSE bölümüne düşer. Eksik notları ayrıca belirtmek isterseniz WHEN notu IS NULL THEN 'Not girilmemiş' koşulunu diğer koşullardan önce yazabilirsiniz. Sınır değerleri kontrol etmek için 85, 84, 60, 59, 0 ve NULL gibi örnekleri ayrı ayrı denemek yararlıdır. Koşullu düşünme becerinizi gözden geçirmek için algoritma bilgi testi bir öz değerlendirme aracı olarak kullanılabilir.
CASE WHEN Kullanımı: SELECT, ORDER BY ve GROUP BY Farkları

SELECT içinde: Her satıra sonuç üretme
SELECT içinde CASE, mevcut sütunlardan hareketle her kayıt için görünen bir kategori veya hesaplanmış değer üretir. Not sınıflandırması, yaş grubu, stok durumu ve sipariş türü bu kullanımın tipik örnekleridir. Amaç, satırları tek tek açıklamaktır.
ORDER BY içinde: İş kuralına göre sıralama
SELECT siparis_no, durum
FROM siparisler
ORDER BY CASE
WHEN durum = 'Kritik' THEN 1
WHEN durum = 'Bekliyor' THEN 2
ELSE 3
END;
Burada CASE yeni bir kategori göstermek için değil, sıralama önceliği oluşturmak için kullanılır. Böylece “Kritik” kayıtlar önce, “Bekliyor” kayıtlar sonra listelenir.
GROUP BY içinde: Toplulaştırma kategorisi oluşturma
SELECT
CASE
WHEN tutar >= 1000 THEN 'Yüksek'
ELSE 'Standart'
END AS siparis_grubu,
COUNT(*) AS siparis_sayisi
FROM siparisler
GROUP BY CASE
WHEN tutar >= 1000 THEN 'Yüksek'
ELSE 'Standart'
END;
Bu kullanımda aynı kategoriye düşen satırlar bir araya getirilir; ardından COUNT, SUM veya benzeri toplulaştırmalar uygulanır. Kısaca: SELECT satır sonucu üretir, ORDER BY sıralama kuralı oluşturur, GROUP BY raporlama kategorisi oluşturur.
Sipariş Tutarlarını CASE WHEN ile Kategorilere Ayırma
Bir sipariş tablosundaki tutarları raporlama amacıyla düşük, orta ve yüksek gibi kategorilere ayırmak için CASE WHEN kullanılabilir. Aşağıdaki örnekte 0–499,99 arası tutarlar “düşük”, 500–1.999,99 arası tutarlar “orta”, 2.000 ve üzeri tutarlar ise “yüksek” kabul edilmiştir. Bu sınırlar yalnızca makale içindeki örnek iş kuralıdır.
SELECT
order_id,
total_amount,
CASE
WHEN total_amount IS NULL THEN 'tutar yok'
WHEN total_amount < 0 THEN 'geçersiz tutar'
WHEN total_amount < 500 THEN 'düşük'
WHEN total_amount < 2000 THEN 'orta'
ELSE 'yüksek'
END AS amount_category
FROM orders;
Sorguda üst sınırlar için “küçüktür” operatörü kullanıldığına dikkat edin. 500 değeri ilk koşula girmediği için “orta” kategorisine, 2.000 değeri ise “yüksek” kategorisine gider. Böylece aralıklar arasında boşluk veya çakışma oluşmaz.
| Sipariş kimliği | Tutar | Beklenen kategori |
|---|---|---|
| 101 | 0 | düşük |
| 102 | 499,99 | düşük |
| 103 | 500 | orta |
| 104 | 1.999,99 | orta |
| 105 | 2.000 | yüksek |
| 106 | NULL | tutar yok |
| 107 | -25 | geçersiz tutar |
CASE ifadesini doğrularken aşağıdaki üç adımlı yöntem, özellikle ödev ve sınav sorularında yapılan sınır hatalarını azaltır:
- Koşulları yazın: Aralıkların birbiriyle çakışmadığını ve tüm beklenen değerleri kapsadığını kontrol edin.
- Sınır değerlerini test edin: 0, 499,99, 500, 1.999,99 ve 2.000 gibi alt ve üst sınırlara ayrı ayrı bakın.
- Çıktıyı karşılaştırın: Sorgudan gelen kategorileri beklenen sonuç tablosuyla satır satır karşılaştırın.
NULL tutar için özel bir WHEN yazılmazsa hiçbir sayısal karşılaştırma eşleşmez. CASE içinde ELSE bulunmuyorsa sonuç NULL olur; ELSE yazılmışsa değer o varsayılan sonuca gider. Negatif veya beklenmeyen tutarlar için “geçersiz tutar” gibi ayrı bir kategori kullanmak, bu kayıtların yanlışlıkla “düşük” ya da “yüksek” raporlanmasını önleyebilir.
Yaygın CASE WHEN Hataları ve Son Kontrol Listesi
CASE WHEN yazarken sorun çoğu zaman sözdiziminden değil, iş kuralının sorguya eksik aktarılmasından kaynaklanır. SQL ve programlama temellerini canlı sınıf ortamında pekiştirmek isteyenler, canlı sınıflı yazılım eğitimleri ile bu tür sorguları adım adım uygulayabilir.
- Çakışan aralıklar: “500’den küçük” ve “500’den küçük veya eşit” koşullarını aynı CASE içinde dikkatsizce kullanmak sınır değerinin birden fazla kurala uygun görünmesine yol açar. Koşulları küçükten büyüğe sıralayın ve her değerin yalnızca bir kategoriye girdiğini kontrol edin.
- Yanlış sınır operatörü: 500 tutarının düşük mü, orta mı olacağı “<” ve “<=” seçimine bağlıdır. Önce iş kuralını cümleyle yazın, ardından operatörü seçin.
- Eksik ELSE: Tanımlanmamış değerler ELSE yoksa NULL sonuç üretebilir. Raporun eksik görünmesini istemiyorsanız “belirsiz”, “kontrol gerekli” veya benzeri açık bir varsayılan sonuç belirleyin.
- NULL değerini eşittir ile kontrol etmek:
total_amount = NULLdoğru kontrol değildir. NULL içinIS NULL, dolu olmayan değerleri dışlamak içinIS NOT NULLkullanılır. - Metin ve sayısal değerleri karıştırmak: Tutar karşılaştırırken sayısal değer kullanın; kategori sonucunda ise metin döndürün. Örneğin
total_amount < '500'yerinetotal_amount < 500yazmak daha doğru ve anlaşılırdır. - Gereksiz karmaşık koşullar: Aynı sınırı tekrar tekrar kontrol etmek sorguyu zorlaştırır. Koşulları en dar veya en düşük aralıktan başlayarak sade biçimde sıralayın.
Son kontrol için şu soruları kullanabilirsiniz:
- Koşullar yukarıdan aşağıya mantıklı bir sırada mı?
- Her sınır değeri için beklenen kategori açıkça belli mi?
- NULL ve negatif gibi beklenmeyen değerler ele alındı mı?
- ELSE sonucu raporu yanıltıyor mu?
- Aynı iş kuralı gereksiz tekrarlarla karmaşıklaştırılmış mı?
Sık Sorulan Sorular
CASE WHEN ile IF arasında ne fark vardır?
IF genellikle programlama dillerinde akış kontrolü için kullanılır. CASE WHEN ise SQL içinde sorgu sonucuna koşullu değer üretmek için kullanılır. CASE, SELECT, ORDER BY veya GROUP BY gibi sorgu bölümlerinde kullanılabildiği için tablo verilerini sınıflandırmada daha uygundur.
CASE WHEN içinde NULL değer nasıl doğru kontrol edilir?
NULL kontrolü için IS NULL veya IS NOT NULL kullanılmalıdır. = NULL ifadesi beklenen şekilde çalışmaz. NULL için ayrı bir WHEN yazılmazsa değer ELSE sonucuna, ELSE yoksa NULL çıktısına gider.
WHEN koşullarının sırası değişirse sorgu sonucu neden değişebilir?
CASE koşulları yukarıdan aşağıya değerlendirilir ve ilk eşleşen WHEN sonucu döndürülür. Koşullar çakışıyorsa daha genel koşulu üstte yazmak, daha özel koşulların hiç çalışmamasına neden olabilir.
CASE WHEN kullanırken ELSE yazmak zorunlu mudur?
ELSE zorunlu değildir; ancak tanımlanan hiçbir WHEN eşleşmezse sonuç NULL olur. Raporlarda beklenmeyen değerleri görünür kılmak için çoğu durumda açık bir ELSE sonucu kullanmak daha güvenlidir.
CASE ifadesi aynı anda SELECT, ORDER BY ve GROUP BY içinde kullanılabilir mi?
Evet. SELECT içinde kategori üretmek, ORDER BY içinde özel sıralama yapmak ve GROUP BY içinde kategorilere göre gruplayıp özet almak için CASE kullanılabilir. Her bölümde kullanılan ifade, ilgili raporlama amacına göre yazılmalıdır.
Doğru CASE WHEN kullanımı, koşulları yazıp sınır değerlerini test etmeyi ve sonucu beklenen tabloyla karşılaştırmayı alışkanlık hâline getirmekle kolaylaşır.