Postgresql’de json formatında gelen bir kolonda, string alanında bazı değerleri nasıl filitreleyebileceğimizi örnek bir veri seti üzerinden açıklayalım.

Veri setimiz 3 kolondan oluşsun; territory,date,school. Territory’lerde ilgili tarihlerde attributes kolonundaki özellikler not edilmiştir. Metro var mı yok mu? Manzara kodları ve okul kodu (855 college’a denk gelmektedir).Amacımız territory’lerde college var mı yok muyu işaretlemek

--örnek data setimiz
with data as (select * from (values
    ('Hydepark','03-05-2019'::date,'{"metro": true,"view": [181] ,"school":[805,812,852,856,857]}'::jsonb),
    ('Hamilton','06-08-2019'::date,'{"metro": false,"view": [184,185],"school":[805,855,859]}'::jsonb),
    ('Price Hill','04-07-2019'::date,'{"metro": true,"view": [184,185,189],"school":[855,859]}'::jsonb)
) as v(territory,date,attributes))

select * from data
    Data setimimiz aşağıdaki şekildedir. Görüldüğü gibi attribute kolonu json formatındadır ve metro,view, school attributes’ları içermektedir.

test     Aşağıda ilk kodumuz mevcuttur. Eğer school alanında 855 varsa college yaz yoksa nocollege.    

select d.*,
       case when json_extract_path_text(d.attributes::json, 'school')::jsonb@>'855' then 'college' else 'nocollege'
       end as college
from data d

    Aşağıdaki kod da aynı işlevi görmektedir.
   

select d.*,
       case when  json_extract_path_text(d.attributes::json, 'school') like '%855%' then 'college' else 'nocollege'
       end as college
from data d

    İki kodunda çıktısı aşağıdaki gibidir. Görüldüğü gibi school stringinde 855 içeren territory’lere college eklenmiştir.