2015-01-08 11 views
6

Przeszukałem wiele na ten temat i wciąż nie można uzyskać odpowiedzi. Używam PostgreSQL. Nazwa kolumny to "sekcje", a typ kolumny to json [] w poniższym przykładzie.Jak zdobyć elementy z tablicy Json w PostgreSQL

Moja kolumna wygląda to w bazie:

sections 
[{"name"  : "section1", 
    "attributes": [{"attrkey1": "value1", 
        "attrkey2": "value2"}, 

       {"attrkey3": "value3", 
        "attrkey4": "value4"}] 
}, 
{"name"  : "section2", 
    "attributes": [{"attrkey3": "value5", 
        "attrkey6": "value6"}, 

       {"attrkey1": "value7", 
        "attrkey8": "value8"}] 
}] 

To json tablicy i chcę dostać "attrkey3" w moim wyniku. Aby uzyskać konkretny klucz od Json, mogę użyć json_extract_path_text(json_column, 'json_property'), który działa idealnie dobrze. Ale nie mam pojęcia, jak zdobyć nieruchomość od json [].

Jeśli mówię o powyższym przykładzie, chcę, aby wartość właściwości "attrkey2" była wyświetlana w moim wyniku. Wiem, że to tablica, więc może działać inaczej niż zwykle, np. wszystkie wartości mojej tablicy działałyby jak inny wiersz, więc może będę musiał napisać podkwerendę, ale nie mam pojęcia, jak to zrobić.

Ponadto nie mogę zapisać indeksu statycznie i uzyskać właściwości elementu json z określonego indeksu. Moje zapytanie zostanie wygenerowane dynamicznie, więc nigdy nie dowiem się, ile elementów znajduje się w tablicy json.

Widziałem kilka statycznych przykładów, ale nie wiem, jak je wdrożyć w moim przypadku. Czy ktoś może mi powiedzieć, jak to zrobić w zapytaniu?

+0

Nie jestem pewien, czy masz "json []" (tablica PostgreSQL z wartościami 'json'), czy kolumna' json', która wydaje się być tablicą JSON (jak w twoim przykładzie). Proszę o wyjaśnienie. – pozs

Odpowiedz

8

Nie jestem pewien, masz (tablicę PostgreSQL z json wartości) json[] wpisane kolumny lub json wpisane kolumna, która wydaje się być tablicą JSON (jak w przykładzie).

W obu przypadkach przed wysłaniem zapytania należy rozwinąć tablicę. W przypadku json[], musisz użyć unnest(anyarray); w przypadku tablic JSON w json wpisywanych kolumnie, trzeba użyć json_array_elements(json) (i LATERAL łączy - są ukryte w moich przykładów):

select  t.id, 
      each_section ->> 'name' section_name, 
      each_attribute ->> 'attrkey3' attrkey3 
from  t 
cross join unnest(array_of_json) each_section 
cross join json_array_elements(each_section -> 'attributes') each_attribute 
where  (each_attribute -> 'attrkey3') is not null; 
-- use "where each_attribute ? 'attrkey3'" in case of jsonb 


select  t.id, 
      each_section ->> 'name' section_name, 
      each_attribute ->> 'attrkey3' attrkey3 
from  t 
cross join json_array_elements(json_array) each_section 
cross join json_array_elements(each_section -> 'attributes') each_attribute 
where  (each_attribute -> 'attrkey3') is not null; 

SQLFiddle

Niestety, nie można użyć dowolnego indeksu z Twoje dane. Najpierw musisz naprawić swój schemat, aby to zrobić.

+0

Perfect !! Tego właśnie chciałem. Twój kod w SQLFiddle jest doskonały. Dziękuję za rozwiązanie mojego problemu. –

1

A także, czy nie było najważniejsze dane map w array wartość:

select each_data -> 'value' as value3 
from t cross join jsonb_array_elements(t.sections -> 'attributes') each_attribute 
where each_attribute -> 'key' = '"attrkey3"' 

Wspominam o tym, ponieważ wielki odpowiedź umieszczono również idealne rozwiązanie dla mojego przypadku. Przy okazji, należy również pamiętać o metodzie typu jsonb_array .. dla atrybutu typu .

Powiązane problemy