Sql Split, DateDiff, Coalesce

Günlük / Faydalı Bilgiler / Sql Split, DateDiff, Coalesce

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 COALESCEISNULL 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