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>

screenshot_3

 

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.

11

2-daha sonsa |” ayracına kadar olan kısmı bölüp atıyorum

12

[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

13

4-Bana kalan sonuç istediğim lbfkutuUyeGiris3 metninin içeriği

14

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:

screenshot_4

 

ş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:

screenshot_5

[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

 

 

Print Friendly, PDF & Email

You may also like...

Bir cevap yazın