2014-11-28 7 views
9

Ist es möglich, postgresql 9.4 jsonb Daten zu transformieren, ohne eine Funktion zu erstellen und ohne irgendeine serverseitige Programmiersprache zu benutzen?Wie konvertiert man postgresql 9.4 jsonb in ein Objekt ohne Funktion/serverseitige Sprache

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} 

sie in zu transformieren:

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

Antwort

11

Verwenden jsonb_populate_record() (oder json_populate_record() für json) mit einem bekannten Zeilentyp als Ziel. Sie können eine temporäre Tabelle verwenden, um einen Typ für Ad-hoc-Nutzung registrieren (wenn Sie keine bestehenden Tabelle oder benutzerdefinierte Verbundtyp verwenden):

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

Dann:

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

oder verwenden jsonb_to_record() (oder json_to_record() für json) und bieten eine Spaltendefinitionsliste mit dem Aufruf:

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

Oder Extrakt und Guss jedes Feld einzeln:

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

Alle drei Arbeiten für json und jsonb gleichermaßen. Verwenden Sie einfach die jeweilige Funktionsvariante.

Verwandte:

+0

ah die 'json_to_record' ist das, was ich brauche: 3 Dank – Kokizzu

+1

@Kokizzu: Dass man in 9.4 tatsächlich neu ist. Die anderen zwei Optionen sind auch in Pg 9.3 (für 'json'). –

+0

Postgre ist genial XD (ich bin von NoSQL nach Postgre wegen Jsonb) – Kokizzu

Verwandte Themen