2015-01-08 17 views
6

Ho cercato molto su questo e ancora senza risposta. Sto usando PostgreSQL. Il nome della colonna è "sezioni" e il tipo di colonna è json [] nell'esempio seguente.Come ottenere elementi dall'array Json in PostgreSQL

mia colonna si presenta così nel database:

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

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

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

E 'di matrice JSON e voglio ottenere "attrkey3" nel mio risultato. Per ottenere una chiave particolare da Json, posso usare json_extract_path_text(json_column, 'json_property') che funziona perfettamente bene. Ma non ho idea di come ottenere alcune proprietà da JSON [].

Se parlo di esempio precedente, voglio ottenere il valore della proprietà "attrkey2" da mostrare nel mio risultato. So che è un array, quindi potrebbe funzionare in modo diverso dal solito, ad es. tutti i valori del mio array agirebbero come una riga diversa, quindi potrei dover scrivere sottoquery ma non ho idea di come farlo.

Inoltre, non riesco a scrivere indice in modo statico e ad ottenere la proprietà dell'elemento json da un indice particolare. La mia query verrà generata dinamicamente, quindi non saprei mai quanti elementi ci sono all'interno di json array.

Ho visto alcuni esempi statici ma non so come implementarlo nel mio caso. Qualcuno può dirmi come farlo nella query?

+0

Non sono sicuro di avere una colonna tipizzata 'json []' (array PostgreSQL di 'json'), o una colonna tipizzata' json', che sembra essere una matrice JSON (come nel vostro esempio). Si prega di precisare. – pozs

risposta

8

io non sono sicuro di avere un (array PostgreSQL di json valori) json[] dattiloscritte colonna o una colonna json digitato, che sembra essere una matrice JSON (come nel tuo esempio).

In entrambi i casi, è necessario espandere l'array prima di eseguire una query. In caso di json[], è necessario utilizzare unnest(anyarray); in caso di array JSON in una colonna json digitato, è necessario utilizzare json_array_elements(json) (e LATERAL join - sono implicite nei miei esempi):

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

Purtroppo, non è possibile utilizzare qualsiasi indice con i tuoi dati. Devi prima correggere lo schema, per farlo.

+0

Perfetto !! Questo è quello che volevo. Il tuo codice in SQLFiddle è perfetto. Grazie per aver risolto il mio problema. –

1

E inoltre, se ci fosse una chiave di dati di valore mappa in array:

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

Lo dico questo perché la grande risposta anche fornito una soluzione perfetta per il mio caso. A proposito, anche essere a conoscenza del metodo jsonb_array .. per l'attributo di tipo jsonb.

Problemi correlati