2016-10-09 4 views
3

Ich habe diese Tabelle auf mu PostgreSQL 9.05:Wie bekomme ich ein Json-Objekt als Spalte in Postgresql?

Tabelle: core Fields: name, description, data

data Feld ist ein json Feld, mit (zum Beispiel): {"id": "100", "tax": "4,5"}

Immer ist one JSON pro Daten.

Meine Frage ist: Kann ich alle JSON-Felder als Abfragefelder bekommen? zurück wie diese: name, description, id, tax....

Das Problem ist: mein JSON hat verschiedene Felder, kann ID, Steuer oder andere sein.

+1

See [Postgres: Flatten aggregierten Schlüssel/Wert-Paare aus einem JSONB Feld] (http://stackoverflow.com/a/ 35179515/1995738) – klin

Antwort

5

Sie können das nicht "dynamisch" tun. Sie müssen die Spalten, die Sie haben möchten, angeben:

select name, description, id, 
     data ->> 'tax' as tax, 
     data ->> 'other_attribute' as other_attribute 
from core; 

Wenn Sie, dass eine Menge, möchten Sie vielleicht, dass in eine Ansicht setzen.


Eine weitere Option ist ein Objekttyp in Postgres zu erstellen, die die Attribute in Ihrem JSON repräsentiert, z.B.

create type core_type as (id integer, tax numeric, price numeric, code varchar); 

können Sie werfen dann die JSON auf diese Art und die entsprechenden Attribute aus dem JSON werden automatisch in Spalten umgewandelt werden:

Mit der oben genannten Art und die folgende JSON: {"id": "100", "tax": "4.5", "price": "10", "code": "YXCV"} Sie tun können:

select id, (json_populate_record(null::core_object, data)).* 
from core; 

und es wird zurück:

id | tax | price | code 
---+------+-------+----- 
1 | 4.50 | 10 | YXCV 

Aber Sie müssen sicherstellen, dass jeder JSON-Wert in den Typ des entsprechenden Objektfelds umgewandelt werden kann.

Wenn Sie den Objekttyp ändern, wird jede Abfrage, die ihn verwendet, automatisch aktualisiert. So können Sie die Spalten, die Sie interessieren, über eine zentrale Definition verwalten.

+0

Danke, aber ich weiß nicht alle Spalten können innerhalb JSON sein, kann 1 oder 2 sein .. oder 10 ... kann ich das dynamisch tun? –

+0

@fh_bash: wie gesagt: das kann man nicht "dynamisch" machen. In SQL muss die Anzahl der Spalten einer Abfrage definiert sein _ bevor diese Abfrage ausgeführt wird, und alle Zeilen eines Ergebnisses müssen die gleiche Anzahl an Spalten haben. –

0

Ab PostgreSQL 9.4 können Sie auch json_to_record verwenden.

Erstellt einen beliebigen Datensatz von einem JSON-Objekt (siehe Hinweis unten). Wie bei allen Funktionen, die einen Datensatz zurückgeben, muss der Aufrufer explizit die Struktur des Datensatzes mit einer AS-Klausel definieren.

Zum Beispiel:

select * from json_to_record('{"a":1,"b":[1,2,3],"c":"bar"}') as x(a int, b text, d text) 

Returns

a | b | d 
---+---------+--- 
1 | [1,2,3] | 
Verwandte Themen