SQL Split Fonksiyonu – SQL de metin parçalama ,bölme
Merhabalar arkadaşlar bu gün sql de metin üzerinde split işlemi (bölme , parçalama )nasıl yapacağız onu öğreneceğiz. SQL de split için şu anlık hazır bir fonksyon bulunmamaktadır bu nedenle split fonksyonumuzu kendimiz kullanacağız şimdi başlayalım.
Öncelikle parçalama yapacağımız örnek bir metin vereceğim onun üzerinde parçalama işlemi yapacağız :
lbfKUTU_HESABIM|Hesabım<i class="icon1"></i> lbfkutuUyeGiris1|<a class="btnUser" href="javascript:void(0);"><i class="icon1 user1"> lbfkutuUyeGiris3|<span>Kayıtlı adreslerinize hızlıca ulaşmak için giriş yapın.</span> lbfkutuUyeGiris2|<b></b> <style>.userLogoff {display:none !important;}</style> lbfkutuUyeGiris4|<ul class="ulK1"><li><a href="/uyelik-bilgilerim/"><span>Üyeli lbfKUTU_SEPET|<a href="javascript:void(0);"><span><span>Kovanızdakiler</span>
Metnimizi çekeceğimiz tablo ve içeriğini oluşturalım
-- CREATE TABLE MetinTablosu (Metin NVARCHAR(MAX) ) GO INSERT INTO MetinTablosu VALUES ('lbfKUTU_HESABIM|Hesabım<i class="icon1"></i> lbfkutuUyeGiris1|<a class="btnUser" href="javascript:void(0);"><i class="icon1 user1"> lbfkutuUyeGiris3|<span>Kayıtlı adreslerinize hızlıca ulaşmak için giriş yapın.</span> lbfkutuUyeGiris2|<b></b> <style>.userLogoff {display:none !important;}</style> lbfkutuUyeGiris4|<ul class="ulK1"><li><a href="/uyelik-bilgilerim/"><span>Üyeli lbfKUTU_SEPET|<a href="javascript:void(0);"><span><span>Kovanızdakiler</span>') GO --
[raw] [/raw]
Metnimizde bana lazım olan kısım
örneğin ben fonksiyonuma “lbfkutuUyeGiris3” metnimi vereceğim kendinden sonraki “|“ işaretiyle diğer “lbf” ile başlayan kısma kadar olan metni bana geri vericek : “<span>Kayıtlı adreslerinize hızlıca ulaşmak için giriş yapın.</span>“
yaptığımız işlemleri görsel olarak anlatırsam
öncelik olarak metnimizde nasıl bir işlem yapıyoruz:
1-lbfkutuUyeGiris3 metnimizin öncelikle sol tarafında kalan kısmı kesip atıyoruz.
2-daha sonsa “|” ayracına kadar olan kısmı bölüp atıyorum
[raw] [/raw]
3- ve son kısımdada “lbf” ile başlayan ilk yerin konumunu alıp oradan kalanın sağ tarafını kesip atıyorum
4-Bana kalan sonuç istediğim lbfkutuUyeGiris3 metninin içeriği
yazacağımız fonksiyonumuzun ne sonuç vereceğini test etmek için ve adım adım neler yaptığını görmek için gereken select sorgusunu yazdım.
[raw] [/raw]
-- DECLARE @Metin NVARCHAR(MAX), @Ayrac1 NVARCHAR(MAX)='lbfkutuUyeGiris3', -- Hangi metnin içeriğini istiyorsak onu yazıyoruz @Ayrac3 NVARCHAR(MAX)='|',-- Aranılacak metinden sonraki ilk | işaretinden sonra ki kısmı ayırmak için @Ayrac2 NVARCHAR(MAX)='lbf',-- Aranılan metinden sonraki ilk lbf ye kadar olan kısmı alıcak yani son ayracımız @uzunluk INT, @uzunluk2 INT, @INDEX INT, @INDEX2 INT, @INDEX3 INT, @MetinYedek NVARCHAR(MAX), @MetinYedek2 NVARCHAR(MAX), @MetinYedek3 NVARCHAR(MAX) SELECT @Metin=Metin FROM MetinTablosu --metnimizi tablomuzdan çekip @Metin e atıyoruz SELECT @uzunluk=LEN(@Metin) -- metnin tamamının uzunluğunu alıyorum SELECT @INDEX=CHARINDEX(@Ayrac1,@Metin) --Metnimizdeki aranılacak kelimemizin kaçıncı karakterde başladığının bilgisini aldık SELECT @MetinYedek=RIGHT(@Metin,@uzunluk-@INDEX+1) -- şimdi metnimizin aranılan kelimenin öncesinde yani sol tarafında kalan --kısım varsa onu kesip atıyoruz kalan kısmı @MetinYedek e atıyoruz SELECT @uzunluk2=LEN(@MetinYedek) -- tekrar metnimizin uzunluğunu hesaplatıyorum SELECT @INDEX2=CHARINDEX(@Ayrac3,@MetinYedek) -- Kaalan metnimizde "|" ayracımızın ilk bulunduğu yerin bilgisini alıyoruz SELECT @MetinYedek2=RIGHT(@MetinYedek,@uzunluk2-@INDEX2+1) -- ve yine "|" işaretinin bulunduğu yere kadar metnin sağ tarafını kesip alıyoruz ve --metnimizden aranılan kelime kısmını çıkartıyoruz. SELECT @INDEX3 = CHARINDEX(@Ayrac2,@MetinYedek2,3) -- kalan metnimizde "lbf" kelimesinin ilk bulunduğu yerin bilgisini alıyoruz IF @INDEX3 =0 BEGIN --sorgumuzun amacı eğer metnimizin son satırını alıyorsak metnimizin son kısmında -- lbf diye bir kısım bulunmayacak ve hata almamak için bu şartı koyuyoruz SELECT @MetinYedek2 -- END ELSE BEGIN -- eğer son satır değilse yani devamında lbf ile başlayan bir kısım olursa SELECT @MetinYedek3=LEFT(@MetinYedek2,@INDEX3-1) --kalan metni ilk lbf gördüğü yerden kesip sadece sol kısmını alıcak ve diğer kısmı alıcak SELECT @MetinYedek3 -- ve sonuç olark parçalanmasını istediğimiz kısmı ekrana yazıdracağız. END; --
[raw] [/raw]
şimdi sorgumuzu bir fonksiyon haline getirelim :
-- CREATE FUNCTION F_SPLIT ( @Metin NVARCHAR(MAX), @Ayrac1 NVARCHAR(MAX) ) RETURNS NVARCHAR(MAX) AS BEGIN DECLARE @Sonuc NVARCHAR(MAX), @Ayrac3 NVARCHAR(MAX)='|',-- Aranılacak metinden sonraki ilk | işaretinden sonra ki kısmı ayırmak için @Ayrac2 NVARCHAR(MAX)='lbf', @uzunluk INT, @uzunluk2 INT, @INDEX INT, @INDEX2 INT, @INDEX3 INT, @MetinYedek NVARCHAR(MAX), @MetinYedek2 NVARCHAR(MAX), @MetinYedek3 NVARCHAR(MAX) SELECT @uzunluk=LEN(@Metin) -- metnin tamamının uzunluğunu alıyorum SELECT @INDEX=CHARINDEX(@Ayrac1,@Metin) --Metnimizdeki aranılacak kelimemizin kaçıncı karakterde başladığının bilgisini aldık SELECT @MetinYedek=RIGHT(@Metin,@uzunluk-@INDEX+1) -- şimdi metnimizin aranılan kelimenin öncesinde yani sol tarafında kalan --kısım varsa onu kesip atıyoruz kalan kısmı @MetinYedek e atıyoruz SELECT @uzunluk2=LEN(@MetinYedek) -- tekrar metnimizin uzunluğunu hesaplatıyorum SELECT @INDEX2=CHARINDEX(@Ayrac3,@MetinYedek) -- Kaalan metnimizde "|" ayracımızın ilk bulunduğu yerin bilgisini alıyoruz SELECT @MetinYedek2=RIGHT(@MetinYedek,@uzunluk2-@INDEX2+1) -- ve yine "|" işaretinin bulunduğu yere kadar metnin sağ tarafını kesip alıyoruz ve --metnimizden aranılan kelime kısmını çıkartıyoruz. SELECT @INDEX3 = CHARINDEX(@Ayrac2,@MetinYedek2,3) -- kalan metnimizde "lbf" kelimesinin ilk bulunduğu yerin bilgisini alıyoruz IF @INDEX3 =0 --sorgumuzun amacı eğer metnimizin son satırını alıyorsak metnimizin son kısmında BEGIN -- lbf diye bir kısım bulunmayacak ve hata almamak için bu şartı koyuyoruz SELECT @Sonuc= @MetinYedek2 -- END ELSE BEGIN -- eğer son satır değilse yani devamında lbf ile başlayan bir kısım olursa SELECT @MetinYedek3=LEFT(@MetinYedek2,@INDEX3-1) --kalan metni ilk lbf gördüğü yerden kesip sadece sol kısmını alıcak ve diğer kısmı alıcak SELECT @Sonuc=@MetinYedek3 -- ve sonuç olark parçalanmasını istediğimiz kısmı ekrana yazıdracağız. END RETURN(@Sonuc) END --
[raw] [/raw]
Fonksiyonumuzu başarılı bir şekilde oluşturabildik:
şimdi oluşturduğumuz Fonksiyonumuzu kullanacağımız ufak bir örnek yapalım
-- DECLARE @Metin NVARCHAR(MAX), @Ayrac1 NVARCHAR(MAX)='lbfkutuUyeGiris3' SELECT @Metin=Metin FROM MetinTablosu SELECT DBO.F_SPLIT(@Metin,@Ayrac1) --
ve sonucumuz:
[raw] [/raw]
Eğer bu fonksiyon çok uzun oldu diyorsanız fonksiyonumuz kısaltabiliriz:
-- CREATE FUNCTION F_SPLIT ( @Metin NVARCHAR(MAX), @Ayrac1 NVARCHAR(MAX) ) RETURNS NVARCHAR(MAX) AS BEGIN DECLARE @Sonuc NVARCHAR(MAX), @Metin2 NVARCHAR(MAX) SELECT @Metin=RIGHT(RIGHT(@Metin,LEN(@Metin)-CHARINDEX(@Ayrac1,@Metin)+1), LEN(RIGHT(@Metin,LEN(@Metin)-CHARINDEX(@Ayrac1,@Metin)+1))-CHARINDEX('|',RIGHT(@Metin,LEN(@Metin)-CHARINDEX(@Ayrac1,@Metin)+1))+1) IF CHARINDEX('lbf',@Metin,3) =0 BEGIN SELECT @Sonuc= @Metin -- END ELSE BEGIN SELECT @Metin2=LEFT(@Metin,CHARINDEX('lbf',@Metin,3)-1) SELECT @Sonuc=@Metin2 END RETURN(@Sonuc) END --
[raw] [/raw]
sonuç olarak istediğimiz bir metin üzerinde split fonksiyonu oluşturduk ihtiyaca göre fonksiyonumuzda değişikliler yapılabilir benim ihtiyacım buydu ve bu şekilde bir geliştirme yaptım .
gerisi size kalmış .
İyi çalışmalar, Kolay Gelsin
Salih ŞEKER