2014-11-28 11 views
9

È possibile trasformare i dati jsonb di postgresql 9.4 senza creare funzioni e senza utilizzare alcun linguaggio di programmazione lato server?Come convertire postgresql 9.4 jsonb in oggetto senza funzione/linguaggio lato server

CREATE TABLE test (id SERIAL PRIMARY KEY,data JSONB); 
INSERT INTO test(data) VALUES('{"a":1,"b":2}'); 
INSERT INTO test(data) VALUES('{"a":3,"b":4,"c":7}'); 
INSERT INTO test(data) VALUES('{"a":5,"b":5,"d":8}'); 
SELECT * FROM test; 
id |   data  
----+------------------------- 
    1 | {"a": 1, "b": 2} 
    2 | {"a": 3, "b": 4, "c": 7} 
    3 | {"a": 5, "b": 5, "d": 8} 

per trasformarla in:

{1:[1,2,null,null],2:[3,4,7,null],3:[5,5,null,8]} 

risposta

11

Uso jsonb_populate_record() (o json_populate_record() per json) con un tipo di riga noto come bersaglio. È possibile utilizzare una tabella temporanea per registrare un tipo per uso ad-hoc (se non è possibile utilizzare una tabella esistente o tipo composito su ordinazione):

CREATE TEMP TABLE obj(a int, b int, c int, d int);

Poi:

SELECT t.id, d.* 
FROM test t 
    , jsonb_populate_record(null::obj, t.data) d;

o utilizzare jsonb_to_record() (o json_to_record() per json) e fornire un elenco definizione di colonna con la chiamata:

SELECT t.id, d.* 
FROM test t 
    , jsonb_to_record(t.data) d(a int, b int, c int, d int);

O estratto e gettato ogni campo singolarmente:

SELECT id, (data->>'a')::int AS a, (data->>'b')::int AS b 
     , (data->>'c')::int AS c, (data->>'d')::int AS d 
FROM test;

Tutti e tre di lavoro per json e jsonb simili. Basta usare la rispettiva variante di funzione.

correlati:

+0

ah il 'json_to_record' è quello che ho bisogno: 3 grazie – Kokizzu

+1

@Kokizzu: Che uno è in realtà nuova in 9.4. Anche le altre due opzioni sono in pg 9.3 (per 'json'). –

+0

postgre è fantastico XD (sto passando da NoSQL a Postgre a causa di jsonb) – Kokizzu

Problemi correlati