2017-01-05 2 views
1

ich ein jsonb Feld in PostgreSQL mit dem folgenden Inhalt haben:PostgreSQL json (b) - Wandelt String Array & Updates Feld

{ "object": { "urls": "A;B;C" } }

Was ich tun möchte, ist Update der Wert urls innerhalb des Objekts und transformieren die Zeichenfolge mit Semikolon getrennten Werten in ein JSON-Array. So sollte das Ergebnis wie folgt aussehen:

{ "object" : { "urls": ["A", "B", "C"] } }

ich herausgefunden habe, wie ein JSON-Array zu erhalten.

Mit

to_json(string_to_array(replace((json->'object'->'urls')::text, '"',''), ';'));

gibt mir ["A", "B", "C"] (ich denke, es sollte, es zu tun einen besseren Weg, ohne die Umwandlung json -> Text -> Array. -> json Vorschläge sind willkommen)

Aber Wie aktualisiere ich jetzt das Feld urls mit dem JSON-Array? Wahrscheinlich muss ich jsonb_set verwenden?

Antwort

2

Verwenden jsonb und die Funktion jsonb_set():

create table my_table(id int primary key, jdata jsonb); 
insert into my_table values 
(1, '{ "object": { "urls": "A;B;C" } }'); 

update my_table 
set jdata = jsonb_set(
     jdata, 
     array['object', 'urls'], 
     to_jsonb(string_to_array(replace((jdata->'object'->'urls')::text, '"',''), ';')) 
     ) 
returning *; 

id |    jdata     
----+------------------------------------- 
    1 | {"object": {"urls": ["A", "B", "C"]}} 
(1 row) 
+0

Es funktionierte gut. Ich musste einfach 'WHERE jdata -> 'object' hinzufügen -> 'urls' IST NICHT NULL '. Sonst hatten diese Zeilen null als json (oder jdata in Ihrem Fall). – mxlse