SQL Server 2017 ile Birlikte Gelen Yeni T-SQL Fonksiyonları

SQL Server 2017 ile birlikte birçok yeni T-SQL fonksiyonu da hayatımıza girmiş oldu. Bu kodlar kullanım kolaylığı sağlayarak, karmaşık kodları daha da basitleştirecek özellikte. Bu yazımda sizlere bu kodlar ve kullanım şekillerinden bahsedeceğim.

String_AGG:

Bu fonksiyon aslında çok sık karşılaşılan bir problem olan aynı sütunda alt alta bir şekilde bulunan verileri aralarına istenilen bir ayırma işareti koyarak yan yana yazdırabilme sorununa çözüm getiriyor. Aslında bu işlemi XML kodu yardımıyla yapabilmek mümkün. Dilerseniz örnek üzerinden inceleyelim.

Takım adında bir tablom ve bu tablo içerisinde takım isimlerim yer alsın.

create table teams  ( [name] varchar(50) ) 

go

insert into teams values ('fenerbahçe'),('galatasaray'),('beşiktaş'),('trabzon')

Bu takım isimlerini tek bir satırda aralarına virgül koyarak yan yana aşağıdaki komut yardımıyla yazdırmamız mümkün.

select stuff((select ', ' + [name] as [text()] 
from teams for xml path('')), 1, 1, '')
1

Yeni gelen STRING_AGG fonksiyonu bu işlemi çok daha sade ve kolay bir şekilde gerçekleştiriyor.

select string_agg([name], ', ') from teams 
1

Şimdi örneği biraz daha farklılaştıralım. AdventureWorks2017 database’indeki tabloları kullanarak hangi satış bölgesinde hangi müşterilerim var bunu araştırıyor olalım. String_AGG fonksiyonu ile bu sorguyu aşağıdaki gibi yazmamız mümkün. Fakat bir sorunla karşılaşıyoruz.

select [Name] + ', ' + [CountryRegionCode] + ', ' + [Group]
      ,string_agg([FirstName] + ' ' + [MiddleName] + ' ' + [LastName],', ') customer 
from [Sales].[Customer], [Sales].[SalesTerritory], [Person].[Person]
where [SalesTerritory].[TerritoryID] = [Customer].[TerritoryID] 
  AND [Customer].[CustomerID] = [Person].[BusinessEntityID]
group by [Name], [CountryRegionCode], [Group]
2

Hatada görüldüğü gibi STRING_AGG fonksiyonuna gönderilen veriler yan yana yazdırılacak şekilde bir araya getirildiğinde limit olan 8000 byte değerini aştı. Bu hatayı aşabilmek adına koda aşağıdaki gibi küçük bir cast işlemi ekliyoruz.

select [Name] + ', ' + [CountryRegionCode] + ', ' + [Group]
      ,string_agg(CAST([FirstName] + ' ' + [MiddleName] + ' ' + [LastName] AS varchar(max)), ', ') customer 
from [Sales].[Customer], [Sales].[SalesTerritory], [Person].[Person]
where [SalesTerritory].[TerritoryID] = [Customer].[TerritoryID] 
  AND [Customer].[CustomerID] = [Person].[BusinessEntityID]
group by [Name], [CountryRegionCode], [Group]
3

Trim:
Bu yeni fonksiyon birçok kullanıcı tarafından uzun süredir bekleniyordu. Daha öncesinde String bir ifade içerisindeki boşluk karakterlerini silmek için aşağıdaki gibi çift fonksiyon kullanılıyordu.

SELECT RTRIM(LTRIM('     SQLServer2017    ')) AS Result
4

Yeni gelen Trim fonksiyonu ile birlikte bu işlemi tek bir hamlede gerçekleştirebiliyoruz.

SELECT TRIM('     SQLServer2017    ') AS Result
4

Concat_WS:
Concat_WS fonksiyonu SQL Server 2012 versiyonu ile birlikte kullanmaya başladığımız Concat fonksiyonuyla benzer bir kullanım sunmaktadır. Buradaki fark fonksiyonun isminde yer WS (With Separator) ifadesinden de anlaşılabileceği gibi bu birleştirme işlemini yaparken bir ayraç ekleyebilmemize imkan sağlamasıdır. Bu fonksiyonun kullanımında Concat fonksiyonunda olduğu gibi NULL değerlerin ihmal edildiği unutulmamalıdır. Örnekler üzerinden inceleyecek olursak;
Aşağıdaki sorgu sonucunda gelen 3 kolondaki ifadeleri aralarına bir ayraç koyarak yanyana yazdırmak istiyoruz.

SELECT database_id, recovery_model_desc, containment_desc 
FROM sys.databases
5

Bu işlemi yapabilmek için Concat_WS fonksiyonundan yararlanarak kodumuzu aşağıdaki hale getiriyoruz. Böylece 3 kolonda bulunan ifadeleri aralarına ‘-’ işareti koyarak yanyana kolayca yazdırabiliyoruz.

SELECT CONCAT_WS( ' - ', database_id, recovery_model_desc, containment_desc) AS DatabaseInfo
FROM sys.databases
6

Null değerlerin bu fonksiyondaki davranışıyla ilgili örneğimize bakacak olursak; AdventureWorks database’indeki Adres tablosunda yer alan aşağıdaki 2 kayda baktığımızda AddressLine2 satırının bir kaydımız için boş olduğunu görüyoruz.

7

Bu iki kaydımız için Concat_WS fonksiyonu yardımıyla aralarına virgül koyarak AddressLine1, AddressLine2, City, StateProvinceID, PostalCode kolonlarını yan yana aşağıdaki kod yardımıyla yazdırabiliriz.

SELECT CONCAT_WS(',', AddressLine1, AddressLine2, City, StateProvinceID, PostalCode) AS Address 
FROM [Person].[Address]
WHERE AddressID in (65, 66)
8

Sorgu sonucunu incelediğimizde ilk kaydımızın AddressLine2 satırında yer alan NULL değeri birleştirme işlemimizin ardından ihmal edilmiş oldu. Eğer NULL değerlerin yerine kullanmak istediğimiz bir ifade varsa bu durumda ISNULL fonksiyonundan yararlanmamız gerekiyor. Yukarıdaki örnek üzerinden ilerleyecek olursak; AddressLine2 satırındaki Null değeri yerine ‘N/A’ ifadesi veya herhangi bir değer yazılsın isteyebiliriz. Bu durumda kodumuzu aşağıdaki şekilde değiştiriyoruz.

SELECT 
CONCAT_WS(',', AddressLine1, ISNULL(AddressLine2, 'N/A'), ISNULL(City, ''), StateProvinceID, PostalCode) AS DatabaseInfo
FROM [Person].[Address]
WHERE AddressID in (65, 66)
9

Translate:
Translate fonksiyonu birden fazla Replace fonksiyonunun işlevini daha basit ve kısa yoldan yapmaya yarar. Örnek üzerinden inceleyecek olursak;
2*[3+4]/{7-2} şeklinde bir matematiksel ifademiz olsun ve bu ifadedeki köşeli ve süslü parantez ifadelerini normal parantez ile değiştirmek isteyelim. Eskiden bu işlem için birden fazla Replace fonksiyonu ile bu işlemi yapabiliyorken şimdi Translate fonksiyonu yardımı ile aşağıdaki şekilde bu işlemi kolayca gerçekleştirmemiz mümkün.

SELECT TRANSLATE('2*[3+4]/{7-2}', '[]{}', '()()')
10

Bu işlemin Replace yardımı ile yapılışı aşağıdaki gibi olacaktı:

SELECT
REPLACE
(
      REPLACE
      (
            REPLACE
            (
                  REPLACE
                  (
                        '2*[3+4]/{7-2}',
                        '[',
                        '('
                  ),
                  ']',
                  ')'
            ),
            '{',
            '('
      ),
      '}',
      ')'
) 

Translate fonksiyonunun bir diğer görevi ise GeoJSON formatındaki verileri WKT formatına dönüştürmede kullanılabilmesidir. GeoJSON formatı, çeşitli coğrafi veri yapılarını kodlamak için kullanılan bir formattır. Örneğimize bakacak olursak;

[137.4, 72.3] ifadesinde yer alan köşeli parantez ve arasındaki virgül ifadesini normal paranteze, (137.4 72.3) ifadesinde yer alan normal parantez yerine köşeli parantez ve arasına virgül koymak için aşağıdaki gibi kodumuzu oluşturuyoruz.

SELECT TRANSLATE('[137.4, 72.3]' , '[,]', '( )') AS Point,
    TRANSLATE('(137.4 72.3)' , '( )', '[,]') AS Coordinates
11

Görüldüğü gibi birden fazla “Replace” yerine, “Translate” fonksiyonu, değiştirmek istediğimiz tüm karakterleri, parametre olarak verdiğimiz tüm yeni karakterlere kolaylıkla dönüştürmemize olanak sağladı.

Sonraki yazılarda görüşmek dileğiyle.

KAYNAK:

STRING_AGG: https://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql?view=sql-server-2017

TRIM: https://docs.microsoft.com/en-us/sql/t-sql/functions/trim-transact-sql?view=sql-server-2017

CONCAT_WS: https://docs.microsoft.com/en-us/sql/t-sql/functions/concat-ws-transact-sql?view=sql-server-2017

TRANSLATE: https://docs.microsoft.com/en-us/sql/t-sql/functions/translate-transact-sql?view=sql-server-2017

 

Bu yazı Genel içinde yayınlandı ve , , , , , olarak etiketlendi. Kalıcı bağlantıyı yer imlerinize ekleyin.

Yorum bırakın