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