Bilyoner İnteraktif Hizmetler A.Ş. için hazırladığımız süreç yönetim uygulamasında kullandığımız ve işinize yarayabilecek minicik fonksiyonlar ile karşınızdayız.
İlk olarak SPLIT (ayırma) işleriniz için kullanabileceğiniz bir fonksiyon ile başlayalım. Belirli bir ayraç ile ayrılmış bir listedeki elemanları, sıra ve değeri ile satır olarak listelemek isterseniz bu fonksiyon işinizi görebilir.
CREATE FUNCTION [dbo].[Split] ( @Delimiter varchar(5), @List varchar(8000) ) RETURNS @TableOfValues table ( [RowID] smallint IDENTITY(1,1), [Value] varchar(50) ) AS BEGIN DECLARE @LenString int WHILE len( @List ) > 0 BEGIN SELECT @LenString = (CASE charindex( @Delimiter, @List ) WHEN 0 THEN len( @List ) ELSE ( charindex( @Delimiter, @List ) -1 ) END ) INSERT INTO @TableOfValues SELECT substring( @List, 1, @LenString ) SELECT @List = (CASE ( len( @List ) - @LenString ) WHEN 0 THEN '' ELSE right( @List, len( @List ) - @LenString - 1 ) END ) END RETURN END
select *from Split(',','volkan,ali,ahmet,veli,gözde,yunus')
RowID Value -------------------------------- 1 volkan 2 ali 3 ahmet 4 veli 5 gözde 6 yunus
Daha sonra, bir iş üzerinde harcanan vakti saat cinsinden hesaplayarak bize döndüren bir fonksiyon yazmamız gerekti. Fonksiyonumuza işin başlangıç ve bitiş tarihlerini girmemiz yeterli.
CREATE FUNCTION [dbo].[datediffToWords] ( @d1 DATETIME, @d2 DATETIME ) RETURNS VARCHAR(255) AS BEGIN DECLARE @hours INT, @word VARCHAR(255) SET @hours = ABS(DATEDIFF(HOUR, @d1, @d2)) IF @hours = 0 SET @word = 'aynı saat içerisinde' ELSE BEGIN SET @word = '' IF @hours >= (24) SET @word = @word + RTRIM(@hours/24)+' gün, ' SET @hours = @hours % (24) SET @word = @word + RTRIM(@hours)+' saat' END RETURN @word END
select dbo.datediffToWords('26.05.2009 13:50','26.05.2009 17:40') -- 4 saat select dbo.datediffToWords('23.05.2009 19:50','26.05.2009 17:40') -- 2 gün, 22 saat
Bildiğiniz gibi COALESCE, ISNULL fonksiyonu ile aynı işlevdedir fakat davranış şekli başkadır. COALESCE birden fazla parametre alabilir ve aldığı parametrelerden null olmayan ilk değeri geriye döner.
CREATE TABLE dbo.Staff ( StaffID int identity, StaffName varchar(100), HourlyWage decimal NULL, Salary decimal NULL, Commission decimal NULL, NumberofSales tinyint NULL ) GO INSERT dbo.Staff (StaffName, HourlyWage, Salary, Commission, NumberofSales) VALUES('Volkan', 10.00, NULL, NULL, NULL) INSERT dbo.Staff (StaffName, HourlyWage, Salary, Commission, NumberofSales) VALUES('Özgür', 40.00, NULL, NULL, NULL) INSERT dbo.Staff (StaffName, HourlyWage, Salary, Commission, NumberofSales) VALUES('Gözde', NULL, 10000.00, NULL, NULL) INSERT dbo.Staff (StaffName,HourlyWage, Salary, Commission, NumberofSales) VALUES('Mehmet', NULL, 20000.00, NULL, NULL) INSERT dbo.Staff (StaffName,HourlyWage, Salary, Commission, NumberofSales) VALUES('Derya', NULL, 30000.00, NULL, NULL) INSERT dbo.Staff (StaffName, HourlyWage, Salary, Commission, NumberofSales) VALUES('Mesut', NULL, 40000.00, NULL, NULL) INSERT dbo.Staff (StaffName, HourlyWage, Salary, Commission, NumberofSales) VALUES('Leman', NULL, NULL, 15000, 3) INSERT dbo.Staff (StaffName, HourlyWage, Salary, Commission, NumberofSales) VALUES('Yunus', NULL, NULL, 25000, 2) INSERT dbo.Staff (StaffName,HourlyWage, Salary, Commission, NumberofSales) VALUES('Esma', NULL, NULL, 20000, 6) GO
SELECT StaffName, CAST(COALESCE(HourlyWage * 40 * 52, Salary, Commission * NumberofSales) AS money) AS 'Total Salary' FROM dbo.Staff ORDER BY 'Total Salary'; GO
Staff Total Salary -------------------------------- Gözde 10000,00 Mehmet 20000,00 Volkan 20800,00 Derya 30000,00 Mesut 40000,00 Leman 45000,00 Yunus 50000,00 Özgür 83200,00 Esma 120000,00
Gördüğünüz gibi maaş hesaplaması yapılırken bulabildiğimiz boş olmayan ilk ücret alanından hesaplama işlemini gerçekleştirdik. Bir diğer basit kullanım örneği ise şu şekilde olabilir.
CREATE TABLE dbo.EmailAddress ( EntryID tinyint identity, Email1 varchar(100) NULL, Email2 varchar(100) NULL ) GO INSERT dbo.EmailAddress (Email1, Email2) VALUES('ali[at]gmail.com','ali[at]spacesheep.net') INSERT dbo.EmailAddress (Email1, Email2) VALUES(NULL, 'veli[at]spacesheep.net') INSERT dbo.EmailAddress (Email1, Email2) VALUES('mehmet[at]gmail.com',NULL) INSERT dbo.EmailAddress (Email1, Email2) VALUES(NULL,NULL)
SELECT Coalesce(Email1, Email2, '--') as Email FROM EmailAddress
Email -------------------------------- ali[at]gmail.com veli[at]spacesheep.net mehmet[at]gmail.com --
veya
DECLARE @Emails varchar(8000) SELECT @Emails = COALESCE(@Emails + '; ', '') + Coalesce(Email1, Email2, '--') FROM EmailAddress SELECT @Emails
ali[at]gmail.com; veli[at]spacesheep.net; mehmet[at]gmail.com; --
Görüldüğü gibi COALESCE gönderilen parametrelerden boş olmayan ilk parametreyi bize döndürdü. Güle güle kullanın :)
27.05
Zeki Volkan İşcen