SQL Server If Else Kullanımı

Bu makalemizde, If, Else Yapısından bahsedeceğiz. Program çalışırken belli şarta göre akışı kontrol eden sorgulardır.

IF(koşul)
BEGIN
–Eğer koşulumuz doğru ise bu alandaki ifademiz çalışır.
END
ELSE
BEGIN
–Eğer koşulumuz doğru değilse bu alandaki ifademiz çalışır.
END

İlk örneğinmizde, Sayı değişkenimiz ile Salesorder Details tablosunda var olan kayıtlar 30.000 ‘den az yada fazla kayıt olup olmadığını sorgulayıp, print  edeceğiz.

DECLARE @Sayi INT;
SELECT @Sayi = COUNT(*) FROM Sales.SalesOrderDetail;
IF @Sayi > 30000 BEGIN
PRINT '30 binden fazla kayıt var';
END
ELSE BEGIN
PRINT '30 binden az kayıt var';
END;

İkinci örneğimizde, ay ve yıl kontrolü yapıp ekrana tek yada çift yıl olduğunu yazdıracağız.

IF MONTH(GETDATE()) IN (9) BEGIN
PRINT 'Aylardan Eylül';
IF YEAR(GETDATE()) % 2 = 0 BEGIN
PRINT 'Çift bir yıldayız';
END
ELSE BEGIN
PRINT 'Tek bir yıldayız';
END
END;

Üçüncü örneğimizde, sayı küçük bir sayı oyunu yapıyoruz.

DECLARE @Sayi INT;
SET @Sayi=4;
IF @Sayi >100
PRINT 'BU SAYI BÜYÜK'
ELSE
BEGIN
IF @Sayi < 10
IF @Sayi=1
PRINT 'BİR'
ELSE IF(@Sayi=2)
PRINT 'İKİ'
ELSE IF(@Sayi=3)
PRINT 'ÜÇ'
ELSE IF(@Sayi=4)
BEGIN
PRINT 'DÖRT'
PRINT 'HEDİYE KAZANDIN'
END
ELSE IF (@Sayi=5)
BEGIN
PRINT 'BEŞ'
PRINT 'HEDİYEYE ÇOK YAKLAŞTIN'
END
ELSE
PRINT 'SAYI 5 İLE 10 ARASINDA BİR DEĞERE SAHİP'
ELSE
PRINT 'NE KÜÇÜK NE BÜYÜK'
END;

Dördüncü örneğimizde, de SalesOrderHeader tablosunda IF EXISTS ile bir kayıt var olup olmadığını sorguluyoruz.

IF EXISTS(SELECT * FROM Sales.SalesOrderHeader WHERE SalesOrderID = 3) BEGIN
PRINT 'SalesOrderID değeri 3 olan kayıt mevcut'
END
ELSE BEGIN PRINT 'SalesOrderID değeri 3 olan kayıt yok'
END;

Beşinci Örneğimizde, Şehirler tablosu eğer master database’i içerisinde yoksa yeni bir tablo oluşturup içerisine tüm illeri Insert edeceğiz.

IF NOT EXISTS (
SELECT * FROM sys.tables WHERE name = 'City'
)
BEGIN
CREATE TABLE City (
code char(2) NOT NULL,
name nvarchar(50) NOT NULL
)
INSERT INTO City VALUES
('01', N'Adana'),
('02', N'Adıyaman'),
('03', N'Afyon'),
('04', N'Ağrı'),
('05', N'Amasya'),
('06', N'Ankara'),
('07', N'Antalya'),
('08', N'Artvin'),
('09', N'Aydın'),
('10', N'Balıkesir'),
('11', N'Bilecik'),
('12', N'Bingöl'),
('13', N'Bitlis'),
('14', N'Bolu'),
('15', N'Burdur'),
('16', N'Bursa'),
('17', N'Çanakkale'),
('18', N'Çankırı'),
('19', N'Çorum'),
('20', N'Denizli'),
('21', N'Diyarbakır'),
('22', N'Edirne'),
('23', N'Elazığ'),
('24', N'Erzincan'),
('25', N'Erzurum'),
('26', N'Eskişehir'),
('27', N'Gaziantep'),
('28', N'Giresun'),
('29', N'Gümüşhane'),
('30', N'Hakkari'),
('31', N'Hatay'),
('32', N'Isparta'),
('33', N'Mersin'),
('34', N'İstanbul'),
('35', N'İzmir'),
('36', N'Kars'),
('37', N'Kastamonu'),
('38', N'Kayseri'),
('39', N'Kırklareli'),
('40', N'Kırşehir'),
('41', N'Kocaeli'),
('42', N'Konya'),
('43', N'Kütahya'),
('44', N'Malatya'),
('45', N'Manisa'),
('46', N'K.Maraş'),
('47', N'Mardin'),
('48', N'Muğla'),
('49', N'Muş'),
('50', N'Nevşehir'),
('51', N'Niğde'),
('52', N'Ordu'),
('53', N'Rize'),
('54', N'Sakarya'),
('55', N'Samsun'),
('56', N'Siirt'),
('57', N'Sinop'),
('58', N'Sivas'),
('59', N'Tekirdağ'),
('60', N'Tokat'),
('61', N'Trabzon'),
('62', N'Tunceli'),
('63', N'Şanlıurfa'),
('64', N'Uşak'),
('65', N'Van'),
('66', N'Yozgat'),
('67', N'Zonguldak'),
('68', N'Aksaray'),
('69', N'Bayburt'),
('70', N'Karaman'),
('71', N'Kırıkkale'),
('72', N'Batman'),
('73', N'Şırnak'),
('74', N'Bartın'),
('75', N'Ardahan'),
('76', N'Iğdır'),
('77', N'Yalova'),
('78', N'Karabük'),
('79', N'Kilis'),
('80', N'Osmaniye'),
('81', N'Düzce')
END

Altıncı örneğimizde, Şehir Tablomda 83 kodlu bir il var mı bunu kontrol ettirip yok ise ekleyeceğiz. Var ise Update İşlemi gerçekleştiriyoruz.


IF EXISTS(SELECT code FROM City WHERE code=83)
UPDATE City
SET name='Yeni il adi'
WHERE code=83
ELSE
INSERT INTO City (code,name)
VALUES('83','Yeni İl')
SELECT * FROM City

BONUS SORU: AdventureWorks veritabanımızı baz alarak bir örnek yapalım. Çalışanların bilgilerinin tutulduğu Person.Person tablosuna gidelim, isminin içinden ‘B’ harfi geçen personelin toplamını alıp bunu da bir değişkenin üzerine alalım, sonrasında şöyle bir koşul belirleyelim; eğer (if) gelen değer (yani değişkenin üzerindeki değer) 1500’den büyükse ‘Fazla Kayıt Var!’, 1500’den küçük ise (else if) ‘Az Kayıt Var!’,
eğer hiçbir değilse (else) ‘Hiç Kayıt Yok!’ şeklinde sorgumuzu sonuçlandıralım.


DECLARE @Toplam INT --1.BU BİR KURAL DEĞİL AMA STANDART OLARAK DEĞİŞKENİ TANIMLAMAK GEREKLİ.
SELECT @Toplam = COUNT(*) FROM Person.Person
WHERE FirstName LIKE '%b%' --2. BURADA TABLOMUZDAKİ FİRSTNAME KOLONUNDA İÇİNDE B HARFİ OLAN KAYITLARIN TOPLAMINI DEĞİŞKENE ATIYORUZ.
IF(@Toplam > 2000)
BEGIN print 'Fazla Kayıt Var!'
END
ELSE IF(@Toplam < 2000) BEGIN print 'Az Kayıt Var!' END ELSE BEGIN print 'Az Kayıt Var!' END

Bir senaryo ile pekiştirmeye çalışalım. Projemizde, çalışanları tuttuğumuz ‘Employee’ tablomuz var.Bir çalışanın amiri konumunda başka bir çalışan bulunabilir.Bu yüzden ‘Employee’ tablomuzda, bu amirin id’sini tutacak ‘DirectorId’ sütunumuz var. Senaryoda bizden istenen bir kişi, herhangi bir kişinin amiri konumundaysa sistemden silinemez olması gerekiyor. Proje kodunda deleteEmployee() methodu çalıştırıldığında, amir olan kişi silinmemeli ve geriye ‘false’ değeri döndürülmeli, aksi durumda kişi silinebilir ve geriye ‘true’ döndürülür.


CREATE PROCEDURE DeleteEmployee
@EmployeeId INT -- SP Parametremiz --
AS
BEGIN
DECLARE @Miktar INT -- EmployeeId id'li kişinin kaç kişinin amiri olduğunu tutan sayacımız --
DECLARE @Donen BIT -- Döndüreceğimiz boolean tipi 0 veya 1 --
SELECT @Miktar= COUNT(*) FROM Employees WHERE ReportsTo = @EmployeeId -- Kişi amir pozisyonunda mı? --
IF @Miktar <= 0 -- Kişi herhangi bir kişinin amiri değilse yani sayaç değerimiz 0'a eşit veya küçükse --
BEGIN
DELETE FROM Employees WHERE ReportsTo = @EmployeeId -- Kişi silinir --
SET @Donen = 1 -- Dönüş değeri 'true' yapılır --
SELECT @Donen -- Değer döndürülür --
END
ELSE -- Kişi bir kişinin amiri ise --
SET @Donen = 0 -- Kişi silinmez ve dönüş değeri 'false' yapılır --
SELECT @Donen -- Değer döndürülür --
END
select * from Employees
EXEC DeleteEmployee 5

Bir Sonraki konumuzda görüşmek üzere,

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir