2017-05-04 1 views
0

mit habe ich ein Tabellenschema wie folgt:Gebäude Abfrage in Postgres 9.4.2 für JSONB Datentyp eingebaute Funktion

DummyTable 
------------- 
someData JSONB 

Alle meine Werte ein JSON-Objekt sein. Zum Beispiel, wenn Sie eine select * from DummyTable tun, würde es aussehen

someData(JSONB) 
------------------ 
{"values":["P1","P2","P3"],"key":"ProductOne"} 
{"values":["P3"],"key":"ProductTwo"} 

möchte ich eine Frage, die mich eingestellt geben Ergebnis wie folgt:

[ 
    { 
    "values": ["P1","P2","P3"], 
    "key": "ProductOne" 
    }, 
    { 
    "values": ["P4"], 
    "key": "ProductTwo" 
    } 
] 

ich Postgres Version 9.4.2 verwenden. Ich schaute auf die Dokumentation Seite der gleichen, konnte aber nicht die Abfrage finden, die das obige Ergebnis geben würde.

Allerdings kann ich in meiner API den JSON durch Iterieren über Zeilen erstellen, aber ich würde die Abfrage bevorzugen, die dasselbe tut. Ich versuchte json_build_array, row_to_json auf ein Ergebnis, das von select * from table_name gegeben würde, aber kein Glück.

Jede Hilfe wäre willkommen.

Here ist die Verbindung, die ich gesucht, eine Abfrage für JSONB schreiben

Antwort

1

Sie json_agg or jsonb_agg verwenden können:

create table dummytable(somedata jsonb not null); 
insert into dummytable(somedata) values 
    ('{"values":["P1","P2","P3"],"key":"ProductOne"}'), 
    ('{"values":["P3"],"key":"ProductTwo"}'); 
select jsonb_pretty(jsonb_agg(somedata)) from dummytable; 

Ergebnis:

[ 
    { 
     "key": "ProductOne", 
     "values": [ 
      "P1", 
      "P2", 
      "P3" 
     ] 
    }, 
    { 
     "key": "ProductTwo", 
     "values": [ 
      "P3" 
     ] 
    } 
] 

Obwohl das Abrufen der Daten Zeile für Zeile und Das Erstellen auf der Clientseite kann effizienter gestaltet werden, da der Server viel früher Daten senden kann, nachdem er die erste übereinstimmende Zeile aus dem Speicher abgerufen hat. Wenn das json-Array zuerst erstellt werden muss, müssen alle Zeilen abgerufen und zusammengeführt werden, bevor mit dem Senden von Daten begonnen werden kann.

Verwandte Themen