44  SQL Case ifadesi

SQL case ifadesi C-tipi dillerdeki if-then-else ifadesine benzer ama daha güçlüdür.

Case ifadesinin iki yapısı vardır. Birinci yapıda case ifadesinin hemen arkasından, ilk WHEN kelimesine gelmeden önce bir ifade gelir. Bu opsiyonel ifadeye taban (base) ifade denilir. Birinci kullanımda taban ifadesi bir kere kontrol edilir ve her WHEN ifadesi ile karşılaştırılır. Örneği aşağıdadır.

CASE AramaCumlesi
  WHEN cumle1 THEN sonuc1
  WHEN cumle2 THEN sonuc2
  WHEN cumle3 THEN sonuc3
  ELSE VarsayilanSonuc
END 

Basit bir örnek olarak cinsiyet bilgisinin uzun hale çevrilmesini yazabiliriz.

SELECT
CASE Cinsiyet
  WHEN 'e' THEN 'ERKEK'
  WHEN 'k' THEN 'KADIN'
  ELSE 'BILINMIYOR'
  END AS CinsiyetUzun
FROM ORTAK.KISI;

Eğer taban ifadesi kullanılmıyorsa, ikinci yapı, her WHEN ifadesi bir doğru yanlış olarak değerlendirilir. Eğer WHEN doğru ise then ifadesi çalıştırılır ve case biter. Eğer WHEN yanlış ise bir sonraki WHEN çalıştırılır. Eğer hiçbir WHEN doğru değilse, en son ELSE ifadesinin sonucu gelir.

Bir önceki cinsiyet örneğinin ikinci case yapısında yazımı aşağıdaki gibidir.

SELECT
CASE 
  WHEN Cinsiyet = 'e' THEN 'ERKEK'
  WHEN Cinsiyet = 'k' THEN 'KADIN'
  ELSE 'BILINMIYOR'
  END AS CinsiyetUzun
FROM ORTAK.KISI;

Eğer hiç bir WHEN ifadesi doğru değil ve ELSE ifadesi yoksa case sonucu null olur.

Chinook örnek taban ifadesi

Tarih (Date) fonksiyonları ile daha kolay yapılabilir ama fatura ayını türkçe yazmak için aşağıdaki taban ifadesi kullanan örneğe bakınız.

SELECT 
substr(i.InvoiceDate,6,2),
(case substr(i.InvoiceDate,6,2)
  when '01' then 'Ocak'
  when '02' then 'Şubat'
  when '03' then 'Mart'
  when '04' then 'Nisan'
  when '05' then 'Mayıs'
  when '06' then 'Haziran'
  when '07' then 'Temmuz'
  when '08' then 'Ağustos'
  when '09' then 'Eylül'
  when '10' then 'Ekim'
  when '11' then 'Kasım'
  when '12' then 'Aralık'
  else 'AY bilinmiyor'
end) AY_TURKCE
FROM Invoice i;

İkinci yapı çok güçlüdür ve bir çok ifade zincirleme kontrol edilebilir.

Chinook örnek taban ifadesi kullanmayan

Tarih (Date) fonksiyonları ile daha kolay yapılabilir ama fatura ayını türkçe yazmak için aşağıdaki taban ifadesi kullanmayan örneğe bakınız.

SELECT 
substr(i.InvoiceDate,6,2),
(case
  when substr(i.InvoiceDate,6,2) = '01' then 'Ocak'
  when substr(i.InvoiceDate,6,2) = '02' then 'Şubat'
  when substr(i.InvoiceDate,6,2) = '03' then 'Mart'
  when substr(i.InvoiceDate,6,2) = '04' then 'Nisan'
  when substr(i.InvoiceDate,6,2) = '05' then 'Mayıs'
  when substr(i.InvoiceDate,6,2) = '06' then 'Haziran'
  when substr(i.InvoiceDate,6,2) = '07' then 'Temmuz'
  when substr(i.InvoiceDate,6,2) = '08' then 'Ağustos'
  when substr(i.InvoiceDate,6,2) = '09' then 'Eylül'
  when substr(i.InvoiceDate,6,2) = '10' then 'Ekim'
  when substr(i.InvoiceDate,6,2) = '11' then 'Kasım'
  when substr(i.InvoiceDate,6,2) = '12' then 'Aralık'
  else 'AY bilinmiyor'
end) AY_TURKCE
FROM Invoice i;

Aynı şekilde case ifadesi null işleme içinde kullanılabilir.

SELECT C.CustomerId,
(case 
    when C.Company IS NULL then 'Firma bilgisi yok'
    else C.Company
end
) AS Company 
FROM Customer C