2017-09-18 1 views
0

Ich bin neu in JSON/JSONB-Datentypen und habe einige Probleme bei der Auswahl der JSONB-Elemente aus tieferen Ebenen. HierWie Abfrage PostgreSQL geschachtelte JSONB in ​​tiefer Ebene?

ist ein Beispiel Tabelle:

CREATE TABLE person (id integer, details jsonb); 

INSERT INTO person (id, details) VALUES 
("id": 1, {"favorites":{"colors":"blue", "colors":"red"}}), 
("id": 2), 
("id": 3, {"favorites":{"colors":"blue", "colors":"red", "colors":"green"}}); 


Ich möchte alle p.details wählen -> 'Favoriten' - >> 'Farben', zum Beispiel:

------------------------ 
| id | Favorite colors | 
------------------------ 
| 1 | blue   | 
------------------------ 
| 1 | red    | 
------------------------ 
| 3 | blue   | 
------------------------ 
| 3 | red    | 
------------------------ 
| 3 | green   | 
------------------------ 


Folgendes (oder Ähnliches) gibt eine leere Spalte für Favoritenfarben (auch mit jsonb_array_elements versucht):


Folgendes funktioniert mit einer einfachen Abfrage, aber es stürzt den Browser ab, wenn mehr Daten abgerufen werden (die Endbenutzer verwenden die Abfragen in einem Webbrowser).

SELECT p.id, ((json_array_elements((json_array_elements(p.details::json)::json->>'favorites')::json))::json->>'colors') AS "Favorite colors" 
    FROM "person" p; 

Scheint, dass der Browser viel Speicher verbraucht. Ich habe einige Posts gefunden, die sagen, dass mehrere Aufrufe von json_array_elements die Abfrage verlangsamen: https://www.postgresql.org/message-id/[email protected]

Irgendwelche Hinweise zu diesem Thema?

+0

Was „Browser“ beziehen Sie sich? Feuerfuchs? Chrom? Und wie zeigen Sie das Ergebnis der Abfrage in diesem Browser an? Welche Programmiersprache benutzen Sie? Und was genau meinst du mit "Crash the Browser"? Haben Sie versucht, weniger Daten in Ihrem Browser anzuzeigen? Der Speicherverbrauch des Browsers hat nichts mit dem Speicherverbrauch des Postgres-Servers zu tun. Was erklärt (analysieren, puffern) Sie für diese Fragen? –

Antwort

0

In den von Ihnen bereitgestellten SQL-Abfragen sind Syntaxfehler aufgetreten. Wenn ich richtig db Schema erraten, als sie wie folgt aussieht sollte:

DROP TABLE person; 
CREATE TABLE person (id integer, details jsonb); 

INSERT INTO person (id, details) VALUES 
(1, '{"favorites":[{"colors":"blue"}, {"colors":"red"}]}'::jsonb), 
(2, '{}'::jsonb), 
(3, '{"favorites":[{"colors":"blue"}, {"colors":"red"}, {"colors":"green"}]}'::jsonb); 

Wenn dies richtig ist, als Sie die Ergebnisse per bekommen können:

select id, jsonb_array_elements(details->'favorites')->'colors' from person