08 Nisan 2007

Sql Server'da Case Fonksiyonu

SQL SERVER'da CASE fonksiyonuna bir örnek verelim. Web sitemİzdeki üyeler siteye giriş yaptıktan sonra bir karşılama mesajımız olsun ve bu mesaj da üyenin Cinsiyet,Yaş ve Medeni Durum bilgilerine göre oluşsun.

25 yaşından büyük veya evli bayanları; Hoşgeldiniz Ebru Hanım,
25 yaşından büyük veya evli erkekleri; Hoşgeldiniz Emre Bey,
18-25 yaş arası ve evli olmayan kişileri; Merhaba Ahmet/Ayşe,
18 yaşından küçükleri de; Sevgili Ebru/Emre,

olarak karşılamak isteyelim.

Önce üye tablomuzu yaratalım

CREATE TABLE [dbo].[Uye](
[UserId] [int] IDENTITY(1,1) NOT NULL,
[Ad] [varchar](50) NOT NULL,
[Soyad] [varchar](50) NOT NULL,
[Yas] [smallint] NOT NULL,
[Cinsiyet] [char](1) NOT NULL,
[MedeniHal] [char](1) NOT NULL,
CONSTRAINT [PK_Uye] PRIMARY KEY CLUSTERED
(
[UserId] ASC
)
)

Sonra örnek kayıtlarımız girelim

INSERT INTO Uye(Ad,Soyad,Yas,Cinsiyet,MedeniHal)
VALUES ('Ebru','Kaya',29,'K','B')
INSERT INTO Uye(Ad,Soyad,Yas,Cinsiyet,MedeniHal)
VALUES ('Emre','Aslan',29,'E','E')
INSERT INTO Uye(Ad,Soyad,Yas,Cinsiyet,MedeniHal)
VALUES ('Aslı','Doğan',23,'K','B')
INSERT INTO Uye(Ad,Soyad,Yas,Cinsiyet,MedeniHal)
VALUES ('Selim','Kutlu',17,'E','B')
INSERT INTO Uye(Ad,Soyad,Yas,Cinsiyet,MedeniHal)
VALUES ('Sibel','Ayaz',24,'K','E')
INSERT INTO Uye(Ad,Soyad,Yas,Cinsiyet,MedeniHal)
VALUES ('Nilay','Kalaycı',14,'K','B')



Daha sonra sql cümlemizi aşağıdaki şekilde oluşturalım.

SELECT [UserId],[Message] = CASE
WHEN Cinsiyet='K' AND (Yas>25 OR MedeniHal='E') THEN 'Hoşgeldiniz ' + [Ad]+ ' Hanım'
WHEN Cinsiyet='E' AND (Yas>25 OR MedeniHal='E') THEN 'Hoşgeldiniz ' + [Ad]+ ' Bey'
WHEN Yas>18 THEN 'Merhaba ' + [Ad]
ELSE 'Sevgili ' + [Ad]
END
FROM Uye

Sorgu sonucumuz aşağıdaki şekilde olacaktır.



3 yorum:

Volkan Özçelik dedi ki...

CASE'li query'lerin bir can sıkıcı noktası görsel query tasarlama aparatını mantarlatmasıydı.

Eğer query'nin içinde CASE varsa o query (şu an adını hatırlayamadığım ) görsel query editör'ünü kullanılmaz hale getiriyordu.
(belki SQLServer 2005'te toparlamışlardır)

Bu arada bir not:
Yukarıdaki yazının örnek amaçlı olduğunu; pratik hayata uygulanamayacağını anlıyorum.

Bununla birlikte yazılım mimarisi açısından, neden böyle bir kullanımın uygun olmadığını vurgulamak yararlı olabilir:

"
'Hoşgeldiniz ' + [Ad]+ ' Hanım'
"

kullanımı veritabanı (database tier) ve iş katmanlarını (business tire) iç içe kullandığı için üretim ortamında tavsiye edilmez.

İdeali veritabanını isim ve yaş sonuç kümesi dönmesi ve iş mantığı ile ilgili kısmı iş katmanına bırakmasıdır.

Sevgiler,
Volkan

harun dedi ki...

Sevgili Volkan,
Öncelikle katkın için teşekkürler.

Özellikle veritabanı odaklı projelerde CASE benzeri fonksiyonlar doğru kullanıldığında gerçekten hayat kurtarıyor.Zor kullanıldığı doğrudur.

Verdiğim örnek konusunda haklısın, gerçekçi bir örnek vermek içindi.
Yazılım mimarisi açısından sunum,iş ve veritabanı katmanları kesinlikle ayrı olmalıdır. Kısaca örneklemek gerekrise iş katmanında uygulamaya özel stratejik bilgilerimiz olabilir ve bunun sadece alakalı kişiler tarafından görülmesini isteyebiliriz. Ayrıca genelde değişiklikler iş mantıklarında olduğu için iyi bir iş katmanı taşınabilir,geliştirilebilir olmalıdır ve ana mimari bozulmadan ek metodlar eklenebilmelidir.

Ama özellikle database odaklı projelerde bazı performans gereksinimlerinden dolayı veritabanı katmanında bu tarz kurgular yapmak gerekebiliyor.
Optimizasyon için bazı kurallar çiğnenebiliyor. Şahsi görüşüm veritabanı katmanlarının mümkün olduğu kadar çok optimize edilmesi gereken katmanlar olduğu yönünde.

Kolay gelsin.
Harun

Adsız dedi ki...

I found this site using [url=http://google.com]google.com[/url] And i want to thank you for your work. You have done really very good site. Great work, great site! Thank you!

Sorry for offtopic