PostgreSQL – JSON Veri Tipi İşlemleri

JSON veri tipi ve destekleyici işlevler PostgreSQL 9.2 sürümü ile desteklenmeye başladığında büyük olay olmuştu. Bugün ise PostgreSQL’in ardından diğer veritabanları da birer birer bu veri tipine destek vermeye başlarken, PostgreSQL’de oturmuş bir json desteği mevcut. JSON, web uygulamaları, JavaScript ve REST tabanlı mobil uygulama geliştirenler için vazgeçilmez bir dil hatta eskilerin deyimiyle sabir dil (lingua franca: geçerli dil, ortak dil) durumunda. 9.4 sürümünde ise JSON’ın binary sürümü olan jsonb veri tipi desteği gelmişti.

JSON Fonksiyon ve Operatörleri

Tüm JSON fonksiyon ve operatörleri için https://www.postgresql.org/docs/current/static/functions-json.html adresine bakabilirsiniz.

JSON Veri Eklemek

Önce veri tipi json olan bir sütun içeren bir tablo oluşturalım:

CREATE TABLE aile (id serial PRIMARY KEY, profil json);

Sonra bu tabloya json veri ekleyelim:


INSERT INTO aile (profil) VALUES ('
{{"ad": "Katip", 
  "fertler": [ 
    {"fert": {"ilişki": "baba", "ad": "Hüseyin" }}, 
    {"fert": {"ilişki": "anne", "ad": "Saniye" }}, 
    {"fert": {"ilişki": "çocuk", "ad": "Emrah" }}, 
    {"fert": {"ilişki": "çocuk", "ad": "Sema" }}]}
');

PostgreSQL tabloya veriyi eklemeden önce JSON veriyi doğrulamaktadır.

Dikkat! Geçerli olmayan bir JSON veriyi json veri tipi olarak işaretlenmiş bir sütuna yerleştiremezsiniz!

JSON Veri Sorgulama

Aşağıdaki sorgu  json_extract_path, json_array_elements, ve json_extract_path_text işlevlerini kullanarak aile üyelerini getirmektedir. Sorguyu parçalayıp anlatmaya çalışacağım:

SELECT 
json_extract_path_text(profil, 'ad') AS aile,
json_extract_path_text(json_array_elements (json_extract_path(profil,'fertler')), 'fert','ad') As fert 
FROM aile;
--
 aile     | fert
----------+--------- 
Katip     | Hüseyin
Katip     | Saniye
Katip     | Emrah 
Katip     | Sema

 

SELECT
json_extract_path_text(profil, ‘ad’) AS aile,1
json_extract_path_text( 2 json_array_elements ( 3 json_extract_path(profil,’fertler’) 4 ), ‘fert’,’ad’) As fert FROM aile;

  1. Aile adını text olarak getirir
  2. Aile ferdi adını text olarak getirir
  3. Array elemanlarını ayrı JSON objeleri olarak getirir
  4. Aile fertlerini ayrı objeler olarak getirir

Bu şekilde yazmak yerine fonksiyonların kısayol operatörlerini kullanmak daha kolay geliyor bana, muhtemelen obje tabanlı programlama yapanlara da bu daha doğal gelecektir. Yukarıdaki sorgu bu durumda aşağıdaki gibi daha kolay hale geliyor:

SELECT profile->>'name' As family, 
  json_array_elements((profile->'members')) #>> '{member,name}'::text[] AS member 
FROM families_j;

JSON Sonuç Döndürmek

row_to_json fonksiyonu ile seçilen sütunları JSON formatında çıktı haline getirmek mümkündür.

select row_to_json(words) from words;

Not: olarak PostgreSQL aynı zamanda diğer veritabanları gibi XML de desteklemektir.