T-SQL Koşullu İfadeler
Herkese merhaba,
Bu yazımda sizlere “T-SQL Koşullu İfadeler” konusunu tüm detayları ile anlatmaya çalışacağım.
T-SQL’ de koşullu ifadeleri prosedürlerde, fonksiyonlarda değişkenlerden yararlanarak sıklıkla kullanırız.
Konu başlıklarımız sırası ile aşağıdaki gibidir:
- IF
- IF — ELSE
- CASE
- IIF
Hazırsanız başlayalım.
Koşullu ifadeleri anlatmaya başlamadan önce T-SQL’ de değişken nasıl tanımlanır, değişkenlere başlangıç değeri nasıl verilir, değişkenlerin değeri nasıl değiştirilir sorularına yanıt bulmaya çalışacağız.
T-SQL’ de Değişken Kullanımı
✳ T-SQL’ de Değişken Nasıl Tanımlanır?
- Değişken tanımlamak için “DECLARE” ifadesini kullanırız.
- Değişken adından önce “@” işaratini kullanırız.
- Değişkenimizin veri tipini belirtiriz.
- Birden fazla değişken tanımlamak içinde değişkenlerimizi “,” kullanarak tek DECLARE ifadesi ile tanımlayabiliriz.
Temel kullanımı aşağıdaki gibidir:
DECLARE @VariableName data_type
, @VariableName2 data_type
Örnek olarak TotalAmount adında bir değişken tanımlamak istediğimizde kodumuz aşağıdaki gibi olur.
DECLARE @TotalAmount DECIMAL(14, 4);
İki ve daha fazla değişken tanımlamak istersek;
DECLARE @FirstName varchar(50)
,@LastName varchar(50)
,@Email varchar(65)
veya
DECLARE @FirstName varchar(50)
DECLARE @LastName varchar(50)
DECLARE @Email varchar(65)
✳ Değişkenlere Değer Ataması Nasıl Yaparız?
- Değişken ilk tanımlanırken aşağıdaki şekilde başlangıç değerini verebiliriz.
DECLARE @TotalAmount DECIMAL(14, 4) = 0
- Kodun herhangi bir yerinde başlangıç değeri vermek, değişkenin değerini değiştirmek ve döngü içinde değişkenimizin değerini artırıp azaltmak istediğimizde “SET” ifadesini kullanarak başlangıç değeri verebilir, var olan değeri değiştirebiliriz.
Örnek olarak 1' den 10' a kadar değerleri ekrana yazdırmak istersek;
DECLARE @i tinyint = 1;
WHILE @i<=10
BEGIN
PRINT @i;
END
☑ “PRINT” fonksiyonunu ekrana mesaj vermek için kullanabiliriz.
Yukarıda ki örneğimizde ki gibi yaptığımızda program sonsuz döngüye girer. Bu yüzden değişkenimizin değerini işlem bittikten sonra artırmalıyız.
DECLARE @i tinyint = 1;
WHILE @i<=10
BEGIN
PRINT @i;
SET @i = @i+1;
END
- Tablodan değeri alıp değişken içinde kullanmamız gerekiyorsa “SELECT” ifadesini kullanmamız gerekir.
DECLARE @Email varchar(65);
SELECT @Email = Email
FROM [Hrms].[Person].[Customers]
WHERE Id=1;
SELECT @Email;
Birden fazla değişkenimizin değerini değiştirmek istersek temel kod yapımız aşağıdaki gibi olmalıdır.
DECLARE @VariableName1 data_type = [value]
, @VariableName2 data_type = [value]
DECLARE @FirstName VARCHAR(65) = ''
,@LastName VARCHAR(65) = ''
SELECT @FirstName = FirstName
,@LastName = LastName
FROM [Hrms].[Person].[Customers]
WHERE Id=1;
SELECT CONCAT(@FirstName, ' ', @LastName) as FullName;
Şimdi koşullu ifadelere başlayabiliriz.
1. IF
T-SQL’ de belirli bir koşula göre bazı işlemler yapmamız gerektiğinde “IF” koşullu ifadesini kullanabiliriz.
Temel kullanımı aşağıdaki gibidir:
IF (Boolean_expression)
BEGIN
{ SQL ifadesi }
END
Koşulumuz doğru olduğunda kod bloğumuz “BEGIN” ile başlar ve “END” ifadesi ile sonlanır.
Örnek olarak girilen sayının sıfırdan büyük olduğunu bulmak istersek kodlarımız aşağıdaki gibi olur.
DECLARE @Number INT = 5;
IF @Number > 0
BEGIN
PRINT 'Sayı pozitif.'
END
Ürünümüzün stok adedine göre kritik seviyede olup olmadığını, ürünümüz kritik seviyede ise bilgilendirme maili ya da başka işlemler yapmak istersek;
DECLARE @Piece INT = 10;
IF @Piece <= 15
BEGIN
PRINT 'Ürün kritik seviyededir. Lütfen mağaza temsilcisi ile iletişime geçiniz!'
END
Girilen ürünün olup olmadığını kontrol edip, eğer ürün yoksa hata mesajı vermek istersek;
DECLARE @ProductId INT
SET @ProductId = 10552;
-- Ürün var mı yok mu kontrol etme
IF NOT EXISTS (SELECT * FROM Sales.Products as p WHERE p.Id=@ProductId)
BEGIN
--PRINT 'Ürün bulunamadı'
RAISERROR(15600, -1, -1, 'Ürün bulunamadı');
RETURN;
END
☑ T-SQL’ de ki uygulamalarımızdan hata göndermek istersek “RAISEERROR” ile hata kontrol işlemini gerçekleştirebiliriz. Sistem otomatik olarak ekrana hata verir.
En basit haliyle girilen ürün numarası, müşteri numarası ve ürün adedine göre satış işlemi yapan bir kod yazmak istersek;
USE Etrade
GO
DECLARE @ProductId INT = 1
,@CustomerId INT = 1
,@Piece INT = 5
,@UnitPrice DECIMAL(14, 4)
,@StockPiece INT;
-- ürün kontrolü
IF NOT EXISTS (SELECT * FROM Sales.Products p WHERE p.Id=@ProductId and p.IsActive=1)
BEGIN
RAISERROR(15600, -1, -1, 'Ürün bulunamadı!!!');
RETURN;
END
-- müşteri kontrolü
IF NOT EXISTS (SELECT * FROM Sales.Customers c WHERE c.Id=@CustomerId and c.IsActive=1)
BEGIN
RAISERROR(15600, -1, -1, 'Müşteri bulunamadı!!!');
RETURN;
END
SELECT
@StockPiece = UnitsInStock
,@UnitPrice=UnitPrice
FROM Sales.Products
WHERE Id=@ProductId;
IF @Piece<=@StockPiece
BEGIN
INSERT INTO [Sales].[Sales]
([ProductId]
,[CustomerId]
,[Piece]
,[TotalAmount]
,[SalesDate]
,[CreateDate]
,[IsActive])
VALUES
(@ProductId
,@CustomerId
,@Piece
,@UnitPrice*@Piece
,GETDATE()
,GETDATE()
,1)
-- satılan ürün adedini toplam stok değerinden düşme
UPDATE [Sales].[Products]
SET [UnitsInStock] = UnitsInStock - @Piece
WHERE Id=@ProductId;
END
2. IF — ELSE
T-SQL’ de bir olayın 2 durumu varsa, yani ya “Evet” ya “Hayır” durumu olduğunda IF ve ElSE kullanıırız.
IF koşulumuza uymadığında ELSE bloğuna düşer.
Temel kullanımı aşağıdaki gibidir:
IF (Boolean_expression = true)
BEGIN
{ SQL ifadesi }
END
ELSE
BEGIN
{ SQL ifadesi }
END
Örnek olarak bir günün hafta içi veya hafta sonu olduğunu bulmak istersek aşağıdaki şekilde bir kod yazabiliriz.
DECLARE @Date datetime;
SET @Date = GETDATE() - 81;
IF (DATENAME(WEEKDAY, @Date) IN ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'))
BEGIN
SELECT CAST(@Date as date) as Tarih, 'Hafta İçi' as 'Hafta İçi/Hafta Sonu';
PRINT 'Hafta içi';
END
ELSE
BEGIN
SELECT CAST(@Date as date) as Tarih, 'Hafta Sonu' as 'Hafta İçi/Hafta Sonu';
PRINT 'Hafta sonu';
END
Örnek olarak girilen sayının negatif ya da pozitif olduğunu bulmak istersek kodlarımız aşağıdaki gibi olur.
DECLARE @Number INT = -15;
IF @Number > 0
BEGIN
PRINT 'Sayı pozitif.';
END
ELSE
BEGIN
PRINT 'Sayı negatif.';
END
3. CASE
CASE ifadesi IF-ELSE koşullu ifadesine benzer. Koşullardan bir tanesine uyuyorsa sonucu döndürür, hiç bir koşula uymuyorsa ELSE bloğunda ki değeri döndürür. Kodda ELSE bloğu yoksa NULL değeri döndürür.
Temel kullanımı aşağıdaki gibidir:
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
..
..
WHEN condition. THEN resultN
ELSE result
END;
Bir sınav sonucunun harf notu karşılığını bulmak istersek aşağıdaki şekilde yapabiliriz.
DECLARE @ExamGrade tinyint = 72
,@LetterGrade varchar(10);
SELECT @LetterGrade =
CASE
WHEN @ExamGrade <= 100 AND @ExamGrade > 89 THEN 'AA'
WHEN @ExamGrade <= 89 AND @ExamGrade > 84 THEN 'BA'
WHEN @ExamGrade <= 84 AND @ExamGrade > 79 THEN 'BB'
WHEN @ExamGrade <= 79 AND @ExamGrade > 74 THEN 'CB'
WHEN @ExamGrade <= 74 AND @ExamGrade > 69 THEN 'CC'
WHEN @ExamGrade <= 69 AND @ExamGrade > 64 THEN 'DC'
WHEN @ExamGrade <= 64 AND @ExamGrade > 59 THEN 'DD'
WHEN @ExamGrade <= 59 AND @ExamGrade > 49 THEN 'FD'
ELSE 'FF'
END;
SELECT @LetterGrade as LetterGrade;
Ürünlerin stok adetlerinin 250'den veya 500'den büyük olup olmadığını bulmak istersek;
SELECT
p.*,
CASE
WHEN p.UnitsInStock > 250 THEN 'Ürün 250 ''den fazla'
WHEN p.UnitsInStock > 500 THEN 'Ürün 500 ''den fazla'
ELSE 'Ürün 250 ''den küçük'
END as Description
FROM Sales.Products as p
WHERE p.UnitsInStock <= 1000;
ELSE bloğu olmadan kodumuzu düzenlediğimizde sonucumuz aşağıdaki gibi olur.
SELECT
p.*,
CASE
WHEN p.UnitsInStock > 250 THEN 'Ürün 250 ''den fazla'
WHEN p.UnitsInStock > 500 THEN 'Ürün 500 ''den fazla'
END as Description
FROM Sales.Products as p
WHERE p.UnitsInStock <= 1000;
4. IIF
IIF ifadesi Ternary operatör gibi tek satırda koşul yazmamızı sağlar. Üç parametreden oluşur. İlk parametre koşul, ikinci parametre doğru olduğunda dönecek değer, üçüncü parametre de koşul yanlış olduğunda dönecek değerdir.
Temel kullanımı aşağıdaki gibidir:
IIF (condition, value_true, value_false);
SELECT IIF(1<>0, 'Evet', 'Hayır');
Tabloda ki bir kolonun değerine göre ekranda farklı bir ifade yazmak istersek;
SELECT
c.Id,
c.FirstName as Ad,
c.LastName as Soyad,
c.Email as 'E-mail',
c.IsActive as 'Aktif mi?',
IIF(IsActive = 1, 'Aktif', 'Pasif') as Durum
FROM Person.Customers as c
WHERE CAST(c.CreateDate as DATE) = CAST(GETDATE() as DATE);
Zaman ayırıp okuduğunuz için teşekkür ederim. Umarım faydalı olmuştur. Bir sonraki yazıda görüşmek üzere…
Sağlıcakla kalın.😊