2016-04-20 8 views
1

Ich habe JSON-Daten in einem JSONB-Feld in meiner postgresql 9.5 DB gespeichert.Saubere Möglichkeit, komplexe JSON in Postgresql abzufragen

Gibt es eine Möglichkeit, Unterobjektspalten zu erstellen, ohne zu wissen, welche Spalte ein Unterobjekt ist?

JSON Beispiel in Frage:

{ 
    "a":1, 
    "b":[1,2,3], 
    "c":"bar", 
    "d":{ 
     "key1":"value1", 
     "key2":"value2" 
    } 
} 

kann ich folgendes bekommen alle Schlüssel aus einem JSON-Objekt verwenden.

SELECT * FROM json_object_keys('{"a":1,"b":[1,2,3],"c":"bar", "d":{"key1":"value1", "key2":"value2"}}')

An diesem Punkt kann ich json_to_record dann(), aber ich möchte die Spalte, um ihre eigene separate Felder aufgeteilt.

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

bringt mich

a| b  | c | d  
1| [1,2,3] | bar | {"key1":"value1", "key2":"value2"} 

Gibt es eine Möglichkeit etwas Ähnliches wieder zu bekommen, vorzugsweise in einer einzigen Abfrage?

-------------------------------------------------------------------- 
a| b  | c | d         | key1 | key2  
1| [1,2,3] | bar | {"key1":"value1", "key2":"value2"} |value1 |value2 

Antwort

1
WITH t(v) AS (VALUES 
    ('{ 
    "a":1, 
    "b":[1,2,3], 
    "c":"bar", 
    "d":{ 
     "key1":"value1", 
     "key2":"value2" 
    } 
    }'::JSONB) 
) 
SELECT x1.*,x2.* FROM t, 
    jsonb_to_record(v) as x1(a int,b text,c text,d jsonb), 
    jsonb_to_record(v->'d') as x2(key1 text,key2 text); 

Ergebnis:

a |  b  | c |     d     | key1 | key2 
---+-----------+-----+--------------------------------------+--------+-------- 
1 | [1, 2, 3] | bar | {"key1": "value1", "key2": "value2"} | value1 | value2 
(1 row) 
+0

Dank! Das bringt mich 95% dort hin. Gibt es eine Möglichkeit, den jsonb_to_record (v -> 'd') für alle Objekte auf dieser Ebene zu generieren, wenn Sie nicht explizit wissen, dass D ein anderes JSON-Objekt ist? Ich fand eine json_typeof() Tabellenfunktion, die den Typ erhält. Wäre es eine schlechte Praxis, das SQL aus einer anderen Abfrage zu generieren? Die Herausforderung ergibt sich aus dem Extrahieren von Inhalten von Tabellen Ad-hoc-Build Microsoft Word-Dokumente. Wir wissen nicht, wie viele Spalten jede Tabelle hat, und wir kennen die Namen der Spalten nicht. Keiner der Spaltenkopfnamen oder die Anzahl der Spalten dazwischen ist von Tabelle zu Tabelle konsistent. –