2026 – 2027 Eğitim Dönemi erken kayıt dönemi başladı. Birebir eğitim programlarımız 21 Eylül 2026 tarihinde başlıyor.
Berk Akademi
Ana Sayfa

SQL CASE WHEN Kullanımı: Koşullu Değer ve Kategori Üretme

sql-case-when-kullanimi-kosullu-deger-kategori-uretme
Bu yazıda neler var?
  1. SQL CASE WHEN Nedir ve Hangi Durumlarda Kullanılır?
  2. WHEN Koşulları Hangi Sırayla Değerlendirilir?
  3. CASE WHEN ile SELECT İçinde Değer ve Not Kategorisi Üretme
  4. CASE WHEN Kullanımı: SELECT, ORDER BY ve GROUP BY Farkları
  5. Sipariş Tutarlarını CASE WHEN ile Kategorilere Ayırma
  6. Yaygın CASE WHEN Hataları ve Son Kontrol Listesi
  7. Sık Sorulan Sorular

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?

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?
  • NULL geldiğ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:

  1. Önce ogrenci_adi ve notu gibi kaynak sütunlar seçilir.
  2. WHEN koş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.
  3. 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ı

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:

  1. Koşulları yazın: Aralıkların birbiriyle çakışmadığını ve tüm beklenen değerleri kapsadığını kontrol edin.
  2. 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.
  3. Çı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 = NULL doğru kontrol değildir. NULL için IS NULL, dolu olmayan değerleri dışlamak için IS NOT NULL kullanı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' yerine total_amount < 500 yazmak 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.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin — Yazılım Geliştirici ve Eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; bugün öğrencinin seviyesine ve hedefine göre şekillenen sürdürülebilir öğrenme sistemleri tasarlıyor. 500'den fazla kişiye ezber değil, düşünerek kod yazmayı öğretti — Berk Akademi'de izlemeye değil üretmeye dayalı öğrenme kültürünü o kuruyor.

WhatsApp Hemen Ara