# PostgreSQL CASE WHEN: Çoklu Koşullu Sorgu Yazımı
PostgreSQL veritabanınızda karmaşık koşullara bağlı olarak farklı sonuçlar üretmeniz mi gerekiyor? Veri manipülasyonunuzu kolaylaştırmanın ve kodunuzu daha okunaklı hale getirmenin en etkili yollarından biri olan CASE WHEN ifadesini kullanarak bunu başarabilirsiniz. Bu makalede, PostgreSQL’de çoklu koşullu CASE WHEN ifadelerini kullanarak verimli ve okunaklı sorgular oluşturmayı adım adım öğreneceksiniz. PostgreSQL’in güçlü yeteneklerini kullanarak verilerinizi daha etkili bir şekilde yönetmeyi hedefliyoruz.
Öğrenme Yol Haritası
Bu makale, CASE WHEN kullanımını üç aşamada ele alarak, yeni başlayanlardan ileri seviye kullanıcılara kadar herkesin anlayabileceği bir rehber sunmaktadır:
Yeni Başlayan: (Adım adım açıklama, Basit kod örneği) → Orta: (Gerçek hayat örneği, Optimizasyon ipuçları) → İleri Düzey: (Performans analizi, Edge caseler)
1. PostgreSQL’de CASE WHEN İfadesinin Temelleri: Nedir ve Ne İşe Yarar?
CASE WHEN ifadesi, SQL’de koşullu mantık uygulamak için kullanılan güçlü bir araçtır. Bir veya daha fazla koşulu değerlendirerek, her koşula karşılık gelen farklı sonuçlar döndürür. Bu, verilerinizi farklı kategorilere ayırmak, belirli koşullara bağlı olarak hesaplamalar yapmak veya sorgularınızı daha okunaklı hale getirmek için idealdir. CASE WHEN ifadesinin temel yapısı şu şekildedir:
CASE
WHEN koşul1 THEN sonuç1
WHEN koşul2 THEN sonuç2
...
ELSE sonuç_varsayılan
END
Koşullar sırayla değerlendirilir. İlk doğru olan koşulun sonucu döndürülür. Hiçbir koşul doğru değilse, ELSE bloğunun sonucu döndürülür. ELSE bloğu isteğe bağlıdır; eğer eksikse ve hiçbir koşul doğru değilse NULL değeri döndürülür.
Basit Örnek: Bir öğrenci tablosunda öğrencilerin notlarına göre harf notlarını hesaplayalım:
SELECT
ad,
not,
CASE
WHEN not >= 90 THEN 'A'
WHEN not >= 80 THEN 'B'
WHEN not >= 70 THEN 'C'
WHEN not >= 60 THEN 'D'
ELSE 'F'
END as harf_notu
FROM ogrenciler;
Bu sorgu, her öğrencinin notuna göre karşılık gelen harf notunu hesaplar ve harf_notu sütununda gösterir.
2. Çoklu Koşullar ve Mantıksal Operatörler: CASE WHEN’i Daha Etkili Kullanmak
Çoklu koşulları birleştirmek için AND ve OR mantıksal operatörlerini kullanabilirsiniz. Bu, daha karmaşık koşulların değerlendirilmesini sağlar.
Örnek: Bir ürün tablosunda, hem fiyatı 100 TL’nin altında hem de stok miktarı 10’dan fazla olan ürünleri listeleyelim:
SELECT *
FROM urunler
WHERE
CASE
WHEN fiyat < 100 AND stok > 10 THEN TRUE
ELSE FALSE
END;
Bu sorgu, CASE WHEN ifadesini WHERE klauzu içinde kullanarak, belirtilen koşulları sağlayan ürünleri filtreler. Daha temiz bir yaklaşım için WHERE klauzu içinde doğrudan fiyat < 100 AND stok > 10 koşulunu kullanmak daha verimli olacaktır. CASE WHEN kullanımı burada gereksizdir.
3. Gerçek Hayat Örneği: Müşteri Segmentasyonu
Bir e-ticaret şirketinde, müşterileri harcama alışkanlıklarına göre segmentlere ayırmak istediğimizi düşünelim. Yüksek harcama yapan, orta düzey harcama yapan ve düşük harcama yapan müşterileri farklı segmentlere atayabiliriz:
SELECT
musteri_id,
toplam_harcama,
CASE
WHEN toplam_harcama >= 1000 THEN 'Yüksek Harcama'
WHEN toplam_harcama >= 500 THEN 'Orta Harcama'
ELSE 'Düşük Harcama'
END as musteri_segmenti
FROM musteriler;
Bu sorgu, her müşterinin toplam harcamasına göre bir müşteri segmenti atar.
4. CASE WHEN ile Performans Optimizasyonu: İpuçları ve Teknikler
CASE WHEN ifadesini kullanırken performansı etkileyebilecek bazı noktalara dikkat etmek önemlidir. Örneğin, çok sayıda koşul içeren CASE WHEN ifadeleri sorgunun çalışma süresini uzatabilir. Bu durumlarda, aşağıdaki teknikleri kullanabilirsiniz:
* Koşulları optimize edin: Koşulları mümkün olduğunca basit ve etkili bir şekilde yazın. Gereksiz karmaşıklığı önleyin.
* İndeksleri kullanın: CASE WHEN ifadesinde kullanılan sütunlar üzerinde indeksler oluşturmak, sorgunun performansını artırabilir.
* Fonksiyonel indeksler: Karmaşık koşullar için fonksiyonel indeksler kullanmayı düşünebilirsiniz.
* Alternatif yaklaşımlar: Bazı durumlarda, CASE WHEN yerine FILTER klauzu veya alt sorgular daha performanslı olabilir. Özellikle büyük veri kümeleri için performans testleri yapmanız önerilir. [fatihsoysal.com](https://fatihsoysal.com) adresinden daha fazla performans optimizasyonu ipucu bulabilirsiniz.
5. İleri Seviye Kullanım: CASE WHEN ve Alt Sorgular
CASE WHEN ifadeleri alt sorgularla birlikte kullanılarak daha karmaşık koşullar oluşturulabilir. Örneğin, bir ürünün kategorisine bağlı olarak farklı bir fiyatlandırma stratejisi uygulayabiliriz:
SELECT
urun_id,
fiyat,
CASE
WHEN (SELECT kategori FROM urun_kategorileri WHERE id = urunler.kategori_id) = 'Elektronik' THEN fiyat * 1.1
ELSE fiyat
END as yeni_fiyat
FROM urunler;
Bu sorgu, elektronik ürünlerin fiyatını %10 artırır.
6. Edge Case’ler ve Hata Yönetimi
CASE WHEN ifadelerini kullanırken olası hata durumlarını ve özel durumları (edge case’leri) göz önünde bulundurmak önemlidir. Örneğin, NULL değerlerinin nasıl ele alınacağını belirlemek gerekebilir. COALESCE fonksiyonu gibi fonksiyonlar NULL değerlerini işlemek için kullanılabilir.
7. Gerçek Dünya Senaryoları: Daha Karmaşık Örnekler
Bir müşteri ilişkileri yönetim sisteminde, müşterilerin son işlem tarihlerine ve harcamalarına göre farklı kampanyalara dahil edilmesini sağlayabiliriz:
SELECT
musteri_id,
son_islem_tarihi,
toplam_harcama,
CASE
WHEN son_islem_tarihi > CURRENT_DATE - INTERVAL '30 days' AND toplam_harcama > 500 THEN 'Kampanya A'
WHEN son_islem_tarihi > CURRENT_DATE - INTERVAL '60 days' AND toplam_harcama > 200 THEN 'Kampanya B'
ELSE 'Hiçbir Kampanya'
END as kampanya
FROM musteriler;
Bu sorgu, farklı koşulları karşılayan müşterileri farklı kampanyalara atar.
8. Performans Analizi ve Optimizasyon Stratejileri
Karmaşık CASE WHEN ifadelerinin performansını analiz etmek için EXPLAIN komutunu kullanabilirsiniz. EXPLAIN komutu, sorgunun yürütülme planını gösterir ve performans boğaz noktalarını belirlemenize yardımcı olur. Bu bilgiler ışığında, indeksleme, sorgu optimizasyonu ve hatta veritabanı şeması değişiklikleri gibi optimizasyon stratejileri uygulayabilirsiniz.
Sonuç
PostgreSQL’de CASE WHEN ifadesi, çoklu koşullara bağlı olarak farklı sonuçlar üretmek için güçlü ve esnek bir araçtır. Bu makalede, CASE WHEN ifadesinin temellerinden ileri düzey kullanımına kadar geniş bir yelpazede bilgi verdik. Ancak, her zaman en uygun yaklaşımı belirlemek için performans testleri yapmak ve verilerinizin özelliğine göre en iyi yöntemi seçmek önemlidir. Unutmayın ki, okunaklı ve verimli kod yazmak, uzun vadede bakım ve geliştirme süreçlerini kolaylaştırır.
Sıkça Sorulan Sorular:
1. CASE WHEN ile IF arasında fark nedir? PostgreSQL’de IF fonksiyonu yoktur. CASE WHEN ifadesi koşullu mantık için kullanılır.
2. Çok sayıda koşul olduğunda performans nasıl iyileştirilir? İndeksler oluşturmak, koşulları optimize etmek ve alternatif yaklaşımları değerlendirmek performansı artırabilir.
3. CASE WHEN ifadesi içinde alt sorgu kullanmanın dezavantajları nelerdir? Alt sorgular performansı olumsuz etkileyebilir. Mümkünse, alt sorgular yerine join işlemleri tercih edilmelidir.
4. NULL değerleri nasıl ele alınır? COALESCE veya IS NULL gibi fonksiyonlar kullanılabilir.
5. CASE WHEN ifadesini hangi durumlarda kullanmaktan kaçınmalıyım? Basit koşullar için WHERE klauzu doğrudan kullanmak daha verimli olabilir.
Yazar: Fatih Soysal