MS SQL'de JSON verileriyle çalışmak konulu makale dizisinin ilk bölümünde veritabanımızdaki verileri JSON formatında almayı incelemiştik. Bu bölümde ise JSON verisi üzerinde işlemler yapmayı inceleyeceğiz.
Bu diziyi üç veya dört bölümde tamamlamayı düşünüyorum, bir sonraki bölümde JSON verisini içe aktarmayı (tabloya yazma) incelemeyi, son bölümde ise bunu bir prosedür yazarak dinamik hale getirmeyi planlıyorum. Planladığım prosedür tablo adını ve JSON verisini parametre olarak alacak ve parametrede belirttiğimiz tabloya o verileri yazacak. Böylece farklı tablolar için ayrı ayrı aktarım sorguları yazmaktan kaçınmış olacağız.
Bu bölümde ISJSON, JSON_VALUE, JSON_QUERY ve JSON_MODIFY fonksiyonlarının nasıl kullanıldığını inceleyeceğiz. Şimdilik üzerinden basit örneklerle geçip makaleyi çok uzatmamayı düşünüyorum, sonraki bölümlerde bu fonksiyonları daha detaylı örneklerle kullanacağız.
ISJSON fonksiyonu string bir parametre alıyor ve bu parametredeki değerin JSON formatında olup olmadığını doğrulamamıza yarıyor. Değer JSON formatında ise 1, değilse 0 olarak dönecektir.
Syntax;
ISJSON ( expression )
Örnek;
SELECT ISJSON('{"Adi": "Enes TAŞ"}')
Bu sorgunun sonucunda bize 1 değerini dönecektir.
Başka bir örnek;
select ISJSON('[{"Adi": "Enes TAŞ"}, {"Adi": "Şaban ÇATALLAR"}]')
Yine bu sorgumuzun sonucunda da bize 1 değerini dönecektir.
JSON_VALUE fonksiyonu bir JSON verisinden skalar değeri almak için kullanılır. 2 parametre almaktadır. İlk parametrede JSON verimiz, ikinci parametrede ise almak istediğimiz değerin key'ini belirtmemiz gerekiyor.
Syntax;
JSON_VALUE ( expression , path )
Örnek;
SELECT JSON_VALUE('{"Adi": "Enes TAŞ"}', '$.Adi') as Adi
Bu sorgumuzun sonucunda bize aşağıdaki şekilde bir sonuç dönecektir.
Ya da aşağıdaki gibi bir örneklendirme yapalım,
DECLARE @JSON NVARCHAR(500)= N'{"Adi": "Enes TAŞ", "MailAdresi":"[email protected]"}'
SELECT JSON_VALUE(@JSON, '$.Adi') as Adi, JSON_VALUE(@JSON, '$.MailAdresi') as MailAdresi
JSON verimizi bir değişkene aldık, MailAdresi olarak bir key value değer daha ekledik ve bu iki alanı da ayrı ayrı çektik.
Çıktımız ise resimdeki gibi olacaktır.
JSON_VALUE fonksiyonu kullanarak bir çok işlem yapabiliriz, örneğin müşteri tablomuzda bir Adres alanımız olsun ve bu alanda müşteriye ait adres bilgilerini JSON formatında saklayalım. Daha sonra Adres alanından il ve ilçe bilgilerine göre sorgulama yapalım.
Öncelikle ilk makalede kullandığımız Musteri tablosuna Adres alanımızı ekleyelim.
ALTER TABLE Musteri ADD Adres NVARCHAR(2000)
Şimdi de mevcut müşteri kayıtlarımızın Adres alanlarına bir kaç veri ekleyerek güncelleyelim.
UPDATE Musteri SET Adres= '{"Adres": "Hürriyet Mah.", "Il": "MANİSA", "Ilce":"AKHİSAR"}' WHERE IDMusteri=1
UPDATE Musteri SET Adres= '{"Adres": "Bayındır Mah.", "Il": "ANTALYA", "Ilce": "MURATPAŞA"}' WHERE IDMusteri=2
UPDATE Musteri SET Adres= '{"Adres": "Kültür Mah.", "Il": "ANTALYA", "Ilce":"KEPEZ"}' WHERE IDMusteri=3
Daha sonra JSON_VALUE fonksiyonu yardımıyla örneğin KEPEZ ilçesindeki müşterilerimizi sorgulayalım.
SELECT * FROM Musteri WHERE JSON_VALUE(Adres, '$.Ilce') LIKE '%KEPEZ%'
Sorgumuzun sonucu resimde görüldüğü gibi olacaktır.
Bir de müşterilerimizi İl bilgisine göre order by ile sıralamayı deneyelim ve JSON_VALUE örneklerini tamamlayalım. Adres alanındaki verileri de ayrı alanlar halinde çekelim.
SELECT IDMusteri,Adi,Telefon,MailAdresi,
JSON_VALUE(Adres, '$.Adres') as Adres, JSON_VALUE(Adres, '$.Il') as Il, JSON_VALUE(Adres, '$.Ilce') as Ilce
FROM Musteri ORDER BY JSON_VALUE(Adres, '$.Il')
Çıktımız;
JSON_VALUE fonksiyonu JSON verisinden bir skalar değeri almamızı sağlıyordu, JSON_QUERY fonksiyonu JSON_VALUE fonksiyonundan farklı olarak JSON verisinden bir dizeyi veya bir nesneyi almamızı sağlıyor.
Syntax;
JSON_QUERY ( expression [ , path ] )
Örneğin aşağıdaki şekilde JSON verimiz var.
{
"IDMusteri":1,
"Adi":"Enes TAŞ",
"Telefon":"555-111-11-11",
"MailAdresi":"[email protected]",
"Adres":{"Adres": "Hürriyet Mah.", "Il": "MANİSA", "Ilce":"AKHİSAR"}
}
Bu veride Adres key'i value olarak bir nesne saklamaktadır. Aşağıdaki örnekle bu nesneyi nasıl alabileceğimize bakalım.
JSON_VALUE kullanımından pek bir farkı yok, JSON_VALUE sadece skalar bir değeri alabilirken, JSON_QUERY dize veya nesne alabilir, skalar değeri alamaz. parametremizde $.Adres yerine $.Adi şeklinde bir ifade kullansaydık cevap null sonucunu dönecekti. Yine aynı şekilde $.Adres ifadesini JSON_VALUE fonksiyonunda kullansaydık cevap null dönecekti. Umarım JSON_VALUE ve JSON_QUERY fonksiyonları anlaşılmıştır.
JSON_MODIFY fonksiyonu JSON verisindeki bir özelliği (property) günceller ve güncellenmiş JSON verisini geri döner. 3 parametre alır, ilk parametrede JSON verimiz, ikinci parametre güncellemek istediğimiz key, üçüncü parametremiz bu key'in yeni alacağı değer;
Syntax;
JSON_MODIFY ( expression , path , newValue )
Resimdeki örnekle JSON verimizdeki Telefon özelliğinin değerini güncellemiş olduk.
Sonraki makalemizde OPENJSON fonksiyonunu inceleyeceğiz ve bu fonksiyon ile veritabanımızdaki tablomuza JSON verilerimizi yazacağız.