Anasayfa / Yazılım / SQL / SQL İç İçe Fonksiyonlar

SQL İç İçe Fonksiyonlar

Bundan önceki yazılarımda SQL’de genelde yaptığım işlemleri tek fonksiyona dayalı olarak gerçekleştirdim. Aslında bir fonksiyonun içinde bir başka fonksiyonda kullanabiliriz. Örneğin diyelim ki bir string verinin hem başındaki hemde sonundaki yani hem sağındaki hemde solundaki boşlukları temizlemek istiyoruz. Bunu yapabilmek için iç içe fonksiyon kullanabiliriz. Örnek :

LTRIM(RTRIM(' test '))

Böyle bir iç içe fonksiyonun çalışma mantığını nasıldır açıklayayım. İç içe fonksiyonlarda önce içerideki yani en içte yer alan fonksiyon çalışır, buraya göre veriler listelendikten sonra bir dıştaki fonksiyon çalışır. Böyle böyle en dış fonksiyona kadar işlem devam eder. Yani tıpkı matematikdeki parantezli işlemler gibi, en içten en dışa doğru işlemler gerçekleştirilir. Şimdi AdventureWorks veri tabanı üzerinde Production.ProductReview tablosunda yer alan EmailAddress adres kolonu üzerind işlem yapalım. Bu kolonda mail adresleri yer alıyor. Benim yapmak istediğim şu @ işareti öncesini kesip atıcam ve sonraki emaile ait olan domain kısmını alıp ayrı bir alanda göstericem. Peki bu işlemi nasıl yaparım bir düşünelim. Önceki yazılarımda anlatmıştım, öncelikle benim bunu bölebilmem için nereden bölmem gerektiğini bulmam gerek. Burada baz alacağımız işaret @ işareti. Peki bu @ işareti nerededir nasıl bulurum? Cevap, CHARINDEX ile olur. CHARINDEX ile @ karakterinin indeksini bulurum daha sonra bu indeks nodan sonraki kısmı alırım ve ayrı bir kolonda yazarım. İşte bunu da SUBSTRING ile yaparım. O halde sorgum tam olarak aşağıdaki gibi :

SELECT EmailAddress,
SUBSTRING(EmailAddress,CHARINDEX('@',EmailAddress) + 1,50) AS "DOMAIN ADI"
FROM Production.ProductReview;

Bu sorgu ile öncelikle içte yer alan CHARINDEX ile @ işaretinin yerini buluyorum. Daha sonra SUBSTRING ile buradan bölme işlemini yapıyorum.

Aynı işlemi aşağıdaki sorgu ile de gerçekleştirebilirim

SELECT EmailAddress,
RIGHT(EmailAddress, CHARINDEX('@', REVERSE(EmailAddress))-1) AS "DOMAIN ADI"
FROM Production.ProductReview;

Bu sorguda ise önce en içte yer alan REVERSE ile EmailAddressi tersliyoruz. Daha sonra @ işaretinin yerini buluyoruz. Daha sonrada CHARINDEX değeri -1 kadarını RIGHT fonksiyonu ile elede ediyoruz. Sonuç olarak bu iki sorgu sonrası aynı sonuçları elde ederiz.

140101

String fonksiyonlar ile bir kaç örnek daha yapalım.

Person.Address tablosundan AddressLine1 alanının ilk 7 karakterini listeleyelim.

SELECT AddressLine1, LEFT(AddressLine1,7) 
AS "İlk 7 Karakter" FROM Person.Address

LEFT ile ilk 7 karakteri al dedik.

veya aşağıdaki gibi de yazabiliriz.

SELECT AddressLine1, SUBSTRING(AddressLine1,1,7) 
AS "İlk 7 Karakter" FROM Person.Address

SUBSTRING ile 1. karakterden başlayarak 7 karakter al dedik.

140102

Person.Address tablosunda AddressLine1 kolonunda 7. karakter ile 25. karakterler arasını (7 ve 25 dahil) listeleyelim.

Bunun için sorgumuzda substring 7 ile 19 arasında olmalıdır.

SELECT AddressLine1, SUBSTRING(AddressLine1,7,19) 
AS "7. ve 25. karakterler arası" FROM Person.Address

140103

Person.Person tablosunda ki FirstName ve LastName alanlarını büyük harflerle yazdıralım.

SELECT FirstName, UPPER(FirstName) AS "Büyük Harflerle FirstName", 
LastName, UPPER(LastName) AS "Büyük Harflerle LastName" FROM Person.Person

140104

Production.Product tablosunda ProductNumber alanında yer alan verilerde ilk – işaretinden sonra olan kısımları ayrı bir kolonda listeleyelim.

SELECT ProductNumber, 
SUBSTRING(ProductNumber,CHARINDEX('-',ProductNumber)+1,25) AS "- işareti sonrası"
FROM Production.Product

Öncelikle en içteki CharIndex fonksiyonu ile – işaretinin indeks numarasını bulduk. Daha sonra SUBSTRING ile bu indeks numarası + 1 diyerek bir sonraki karakterinden başlayarak 25. karaktere kadar olan kısmı – işareti sonrası kolonunda listeledik.

140105

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir