SQL CASE WHEN ile koşullu değer üretme: sözdizimi ve örnekler
SQL CASE WHEN ile koşula göre değer üretme, kategori oluşturma, koşullu toplama ve sıralama. Sözdizimi, örnek sorgular ve sık yapılan hatalar.
CASE WHEN nedir, ne işe yarar?
CASE WHEN, SQL'de bir koşula bakıp ona göre farklı değerler döndüren ifadedir. Programlamadaki if else yapısının sorgu içindeki karşılığıdır. Sorgu her satır için koşulu değerlendirir ve sırayla doğru çıkan koşulun değerini sonuç olarak verir.
En sık kullanım amacı ham veriden anlamlı kategoriler üretmektir. Sipariş tutarını yüksek, orta ve düşük gibi segmentlere ayırmak, bir durum kodunu okunur bir etikete çevirmek ya da boş değer yerine açıklayıcı bir metin yazmak tipik örneklerdir. Raporlama tarafında ise koşullu toplama ve koşullu sayımda temel araçtır.
CASE WHEN bir ifadedir, komut değildir. Bu yüzden SELECT listesinde, WHERE, ORDER BY, GROUP BY ve toplama fonksiyonlarının içinde kullanılabilir. Bu esneklik, onu analiz sorgularının vazgeçilmez parçası yapar.
Temel sözdizimi: aranmış ve basit CASE
En yaygın biçim aranmış CASE ifadesidir. Her WHEN satırına bir koşul yazılır; THEN sonrasında koşul doğruysa dönecek değer gelir; ELSE bölümü hiçbir koşul sağlanmazsa dönecek değeri verir; ifade END ile kapanır.
Örneğin sipariş tutarına göre segment üretmek için şu yapı kullanılır: CASE WHEN tutar >= yuksek_esik THEN 'Yüksek' WHEN tutar >= orta_esik THEN 'Orta' ELSE 'Düşük' END. Sorgu koşulları yukarıdan aşağıya sırayla sınar. Doğru çıkanda durur; bu yüzden koşulların sırası sonucu belirler. Aralıklar yazılırken büyük eşiği önce koymak gerekir, aksi halde her satır bu koşula takılır.
Basit CASE ise tek bir sütunu sabit değerlerle karşılaştırır: CASE durum_kodu WHEN 'A' THEN 'Aktif' WHEN 'P' THEN 'Pasif' END. Eşitlik karşılaştırması için pratiktir, ancak büyüktür küçüktür gibi koşullar için aranmış biçim gerekir.
ELSE yazılmazsa ve hiçbir koşul sağlanmazsa sonuç NULL döner. Beklenmeyen NULL değerleri sıklıkla bu şekilde ortaya çıkar; bu yüzden ELSE'i bilinçli olarak yazmak iyi bir alışkanlıktır.
SELECT içinde kategori ve etiket üretmek
En doğal kullanım, SELECT listesinde yeni bir sütun üretmektir. Müşteri tablosunda yaş grubu, ürün tablosunda fiyat bandı, işlem tablosunda durum etiketi bu yöntemle oluşturulur. Üretilen sütuna anlamlı bir takma ad verilir; böylece sonuç tablosu okunabilir olur.
Bir örnek senaryo: bir satış tablosunda her kaydın teslim durumunu tarih alanlarından hesaplamak gerekiyor. Teslim tarihi boşsa 'Bekliyor', teslim tarihi vade tarihinden sonraysa 'Gecikmeli', diğer durumlarda 'Zamanında' yazdırılır. Böylece ham tarih alanları, iş kullanıcısının doğrudan anlayabileceği bir duruma çevrilir.
Kategori üretirken şu ilkelere dikkat edilir: • Koşullar birbirini dışlamalı ve tüm olasılıkları kapsamalı • Sıralama belirleyici olduğu için koşulların dizilişi bilinçli seçilmeli • Aynı kategori mantığı birçok sorguda tekrarlanıyorsa görünümde saklanmalı • Etiket metinleri tutarlı yazılmalı, aynı değer farklı yazımlarla çoğaltılmamalı
Koşullu toplama ve sayım
CASE WHEN'in raporlamada en değerli kullanımı, toplama fonksiyonlarının içinde koşul uygulamaktır. SUM(CASE WHEN durum = 'İade' THEN tutar END) ifadesi yalnızca iade kayıtlarının tutarını toplar; koşulu sağlamayan satırlar NULL döner ve SUM bunları yok sayar. Aynı yapı sayım için de çalışır: COUNT içinde koşul sağlandığında bir değer, sağlanmadığında NULL döndürülürse yalnızca koşulu sağlayan satırlar sayılır.
Bu teknikle tek sorguda birden çok ölçü yan yana alınabilir. Aylık satış raporunda toplam satış, iade tutarı ve kampanyalı satış tutarı ayrı sütunlar olarak, tek GROUP BY ile hesaplanır. Aynı sonucu ayrı sorgular ve birleştirmelerle üretmek hem uzun hem yavaş olurdu.
Bu yaklaşım, satırları sütunlara çevirme (pivot) işleminin de en yalın yoludur: her değer için ayrı bir koşullu toplama sütunu yazılır. Sütun sayısı sabit olduğu sürece bu yöntem tüm veritabanı sistemlerinde çalışır.
WHERE, ORDER BY ve UPDATE içinde kullanım
ORDER BY içinde CASE WHEN, özel sıralama düzeni kurmak için kullanılır. Örneğin öncelik alanı metin olarak tutuluyorsa 'Acil' kayıtların en üstte, ardından 'Normal' ve 'Düşük' olanların geldiği bir sıra tanımlanabilir. Alfabetik sıralama bu ihtiyacı karşılamaz; CASE ile her değere bir sıra numarası verilir.
UPDATE komutunda CASE, tek geçişte farklı satırlara farklı değerler yazmayı sağlar. Fiyat güncellemesinde kategoriye göre farklı oranlar uygulanacaksa, her kategori için ayrı UPDATE yazmak yerine tek komutta CASE kullanılır. Ancak UPDATE'te WHERE koşulu yazılmaz ya da yanlış yazılırsa tüm tabloyu etkiler; bu yüzden önce aynı mantığı SELECT ile deneyip sonucu kontrol etmek ve işlemi bir transaction içinde yapmak güvenlidir.
WHERE içinde CASE kullanımı mümkündür ama genellikle gereksizdir; AND ve OR ile yazılan koşul daha okunaklıdır. Dinamik filtre mantığı gerekiyorsa CASE tercih edilir; ancak indeks kullanımını zorlaştırabileceği unutulmamalıdır.
Sık yapılan hatalar
En sık hata koşul sırasını yanlış kurmaktır. Aralık koşullarında dar olan koşul önce, geniş olan sonra yazılmalıdır; yoksa geniş koşul her satırı yakalar ve diğer WHEN'ler hiç çalışmaz.
Bir diğer hata, NULL değerini normal bir değermiş gibi karşılaştırmaktır. WHEN sütun = NULL ifadesi hiçbir zaman doğru olmaz; NULL için IS NULL kullanılmalıdır. Benzer şekilde CASE içinde dönen değerlerin veri türü uyumlu olmalıdır; bir dalda sayı, diğer dalda metin döndürmek hata ya da beklenmeyen dönüşümlere yol açar.
Diğer sık sorunlar şunlardır: • ELSE yazılmadığı için beklenmeyen NULL sonuçlar • Uzun CASE bloklarının aynı sorguda tekrar tekrar yazılması • Koşullu toplamada ELSE'e yanlış değer verilerek toplamın bozulması • Aynı sütunu birden çok koşulda farklı yazımlarla ele alıp tutarsız sonuç üretme
CASE ifadesi uzayıp karmaşıklaştığında, ayrı bir arama tablosu kurup JOIN ile eşleştirmek daha sürdürülebilir olabilir.
Bu beceriyi Mindset programlarında nerede çalışırsınız?
Mindset kataloğundaki SQL ile Veri Sorgulama (Temel) eğitiminin Koşullu İfadeler ve Değer Dönüşümleri modülü bu konuyu doğrudan işler; Pratik İş Raporları ile Sorgu Geliştirme modülü ise CASE gibi ifadelerin rapor sorgularında nasıl kullanıldığını uygulamalı olarak pekiştirir. Raporlama ve veri analizi görevlerine yeni başlayan ekipler için uygun bir başlangıçtır.
SQL ile Programlama Eğitimi ise Sorgular, Hesaplamalar ve Toplama ve Gruplama başlıklarını bir arada sunar; koşullu toplama gibi teknikler bu başlıklarla birlikte çalışılabilir.
İlgili Mindset programı
SQL ile Veri Sorgulama (Temel)
Sık sorulan sorular
CASE WHEN ile IF arasındaki fark nedir?
CASE WHEN, standart SQL'de çalışan ve tüm büyük veritabanı sistemlerinde desteklenen ifadedir. IF ya da IIF gibi işlevler sisteme özgüdür ve her veritabanında bulunmaz. Çok dallı koşullar için CASE daha okunaklıdır. Taşınabilir sorgu yazmak istiyorsanız CASE tercih edilmelidir.
CASE WHEN içinde birden çok koşul birleştirilebilir mi?
Evet. WHEN satırında AND ve OR ile koşullar birleştirilebilir; parantezle öncelik belirlenir. Örneğin hem bölgenin hem tutarın birlikte değerlendirildiği bir segment tanımı tek WHEN içinde yazılır. Koşul çok uzarsa okunabilirlik için ara sütun hesaplayan bir alt sorgu ya da CTE kullanmak daha anlaşılır olur.
ELSE yazmazsam ne olur?
Hiçbir WHEN koşulu sağlanmazsa sonuç NULL döner. Hata vermez, bu yüzden fark edilmesi zordur. Özellikle koşullu toplamada NULL değerleri sonucu yanlış yönlendirebilir. Bu nedenle ELSE bölümünü her zaman bilinçli olarak yazmak ve varsayılan değeri açıkça belirtmek iyi uygulamadır.
CASE WHEN sorgu performansını etkiler mi?
SELECT listesinde kullanımı genellikle belirgin bir yük getirmez. Ancak WHERE içinde bir sütunu CASE ile dönüştürüp filtrelemek indeks kullanımını engelleyebilir ve büyük tablolarda yavaşlatabilir. Böyle durumlarda koşulu doğrudan sütun üzerinde yazmak ya da filtreyi veri tarafında hazırlamak daha verimlidir.
CASE WHEN ile pivot yapılabilir mi?
Evet. Her hedef sütun için koşullu toplama ya da sayım yazılırsa satırlar sütunlara çevrilir. Bu yöntem, PIVOT komutunu desteklemeyen sistemlerde de çalışır. Sütunlar sabit olduğunda pratiktir; değerler dinamik değişiyorsa sorgunun programatik olarak üretilmesi gerekir.
İlgili rehberler
İlgili eğitimler
Kategori: Veri Analitiği ve İş Zekası