2016-03-22 3 views
0

Es gibt einen einfachen Ausdruck oder eine Funktion zum "Entpacken" von Unterobjekten, explodiert es in das Hauptobjekt?entpacken JSONB-Objekt mit bester Leistung


mit Beispiel erklären:

SELECT '{"x":null,"A":{"foo":true,"bar":123},"B":2332}'::jsonb; 
-- = JSONB object with "A" as sub-object. 

ist ein typischer Fall: I "A" Inhalt in das Hauptobjekt benötigen. Und wenn diese Datentypen (number/boolean/null) erhalten bleiben, ist keine "convert string solution" gültig. Auch gute Performance wird erwartet.

Remove "A" ist in Ordnung mit - 'A', sondern legte seinen Inhalt zurück, ist nicht einfach:

SELECT ('{"x":null,"A":{"foo":true,"bar":123},"B":2332}'::jsonb - 'A') 
    || '{"foo":true,"bar":123}'::jsonb; -- aim result, unpacked! 

SELECT ('{"x":null,"A":{"foo":true,"bar":123},"B":2332}'::jsonb - 'A') 
    || ('{"A":{"foo":true,"bar":123}}'::jsonb)->'A' -- NOT WORKS... 

So platzieren Sie zurück "A" Inhalt?

Antwort

1

Der Operator || hat eine höhere Priorität als der Operator ->, Sie müssen also die Klammern verschieben. Ich änderte nur die letzte von ::jsonb)->'A' zu ::jsonb->'A') und es funktioniert: (!)

SELECT 
    ('{"x":null,"A":{"foo":true,"bar":123},"B":2332}'::jsonb - 'A') 
    || ('{"A":{"foo":true,"bar":123}}'::jsonb->'A'); 
+0

Dank. Über PostgreSQL (v9.5) Entscheidung Ich denke, dass sie falsch sind, höhere [Vorrang] (https: // en.wikipedia.org/wiki/Order_of_operations) am meisten sein für '->' das ist wie ein objektorientierter Pfadoperator, immer höher als algebraische. –

+0

Nun, technisch haben sie die gleiche Priorität (sie fallen beide in die Kategorie [jedes andere] (http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-PRECEDENCE), Da es sich nicht um Standardoperatoren handelt, werden sie von links nach rechts ausgewertet. – pozs