Koşula göre değer üretmek
CASE, programlamadaki if/else'in SQL karşılığıdır. İlk doğru koşulun değerini döndürür.
SELECT name, price,
CASE
WHEN price < 300 THEN 'Ekonomik'
WHEN price < 1500 THEN 'Orta'
ELSE 'Premium'
END AS fiyat_sinifi
FROM products;
- Koşullar sırayla denenir; ilk doğru olan kazanır. Bu yüzden 1500 koşulunda “300'den büyük” demene gerek yok.
- ELSE yazmazsan, hiçbir koşul tutmadığında sonuç NULL olur.
Gruplamada CASE
SELECT CASE WHEN price < 300 THEN 'Ekonomik'
WHEN price < 1500 THEN 'Orta'
ELSE 'Premium' END AS sinif,
COUNT(*) AS urun_sayisi
FROM products
GROUP BY sinif;
Koşullu toplama: analistin süper gücü
Tek sorguda birden fazla sayımı yan yana koymak için CASE'i toplama fonksiyonunun içine koyarsın:
SELECT channel,
COUNT(*) AS toplam,
SUM(CASE WHEN status = 'delivered' THEN 1 ELSE 0 END) AS teslim,
SUM(CASE WHEN status = 'cancelled' THEN 1 ELSE 0 END) AS iptal
FROM orders
GROUP BY channel;
FILTER sözdizimiPostgreSQL ve SQLite standarttaki
COUNT(*) FILTER (WHERE status = 'cancelled') yazımını da destekler.Derinleş: CASE ile yapılan dört iş
- Sınıflandırma: fiyatı bantlara ayırmak.
- Koşullu sayım:
SUM(CASE WHEN status = 'iptal' THEN 1 ELSE 0 END). - Özel sıralama:
ORDER BY CASE status WHEN 'teslim' THEN 1 WHEN 'iade' THEN 2 ELSE 3 END. - Güvenli bölme:
CASE WHEN payda = 0 THEN NULL ELSE pay / payda END.
SELECT status, COUNT(*) AS siparis FROM lk_orders GROUP BY status ORDER BY CASE status WHEN 'teslim' THEN 1 WHEN 'iade' THEN 2 ELSE 3 END;
CASE'in her dalı aynı tipte değer döndürmelidir; bir dalda sayı, diğerinde metin döndürmek bazı SQL türlerinde hata verir.