5 Temmuz 2010 Pazartesi

Sql Case when Kullanımı


Sql de zaman zaman c#,visual basic dillerinde kullandığımız if else komutlarını kullanmak isteyebiliriz.
Ben bu zamana kadar pek karşılaşmamıştım aslında ama bugün birlikte çalıştığım takımda bi arkadaşım sorguları arasına böyle bir kısım eklemiş benimde ilgimi çekti bir kaç küçük araştırmadan sonra birşeyler yazayım dedim :)

Araştırma yaptığımda herkez cinsiyet örneğini vermiş.Bana Biraz basit geldi ama öncelikle işin abc si olarak ona benzer bir sorgu yazayım . . .:)

Kitap Tablomuzdaki ,kitap durumu alanı "NULL,1 VE 0" değerlerini alabiliyor olsun.


SELECT ID,KitapAdi,CASE WHEN KitapDurum = '0' THEN 'Kitap_Kirada'
WHEN KitapDurum = '1' THEN 'Kitap_Mevcut'
ELSE 'Kitap_Henuz_Kütüphanemize_Ulasmadi' END
FROM Kitap

burada eğer 0 değeri atanmış ise kitap yoktur 'Kitap_Kirada' mesajını gösteriyoruz,1 değeri atanmış ise 'Kitap_Mevcut',Eğer Farklı bir değer ise bununda Null olduğunu düşünüyüruz ve Kitabın sadece kendi kaydının girildiği henüz kütüphaneye ulaştı bilgisinin atanmadığını düşünerek 'Kitap_Henuz_Kütüphanemize_Ulasmadi' mesajını veriyoruz.

Bunu gerçek hayatta kritik olarak, örneğin şöyle bir sorguda kullanabilirsiniz:

Şöyle bir tablomuz olsun:
'CREATE TABLE [dbo].[StokHareketleri](
[ID] [int] IDENTITY(1,1) NOT NULL ,
[StokHareketTip] [smallint] NULL,--0.Stok Giriş,1.Stok Çıkış
[StokKodu] [nvarchar](50) NULL,
[StokHareketMiktari] [int] NULL,
CONSTRAINT [PK_StokHareketleri] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
'
Yukarıdaki sorguyu aynen çalıştırarak tabloyu oluşturabilirsiniz

Burada amacımız Stok hareketleri tablosundan toplam stok miktarını almak olsun .Yani Stok Girişi ve çıkışı bu tabloda tutuluyor.Biz yapılan girişlerden çıkış miktarını çıkarıcaz ve elimizde kalan stok miktarını öğrenicez.

SELECT st1.StokKodu,
ISNULL((SELECT
ISNULL(SUM(CASE WHEN StokHareketTip = 0 THEN StokHareketMiktari END),0)-
ISNULL(SUM(CASE WHEN StokHareketTip = 1 THEN StokHareketMiktari END),0)
FROM StokHareketleri AS st2 WHERE st1.StokKodu = st2.StokKodu),0)AS StokMiktarı
FROM StokHareketleri AS st1

Yukarıda Stok hareket tipi giriş olan stok miktarının toplamından ,çıkış olan stok miktarının toplamını çıkar şeklinde bir sorgu yazdık ve sonuç olarak Urun Kodu ve o Ürün için Stok Miktarını elde ettik.

Ayrıca Sorguda "ISNULL" kelimesininde kullanıldığını görüyoruz.
örnek : ISNULL(DEGER,0) ->Bunun anlamı eğer "DEGER" alanı "null" gelir ise null yerine "0" yaz demek oluyor.

umarım faydalı olmuştur.
Yunus Emre Web Developer

Morbi aliquam fringilla nisl. Pellentesque eleifend condimentum tellus, vel vulputate tortor malesuada sit amet. Aliquam vel vestibulum metus. Aenean ut mi aucto.