2016-11-30 3 views
0

Ich habe postgresql mit Jsonb-Feld, das Array immer enthält. Ich muss diesem Array neue Werte hinzufügen oder bereits vorhandene Werte nach Index aktualisieren.Postgresql, Jsonb-Feld, Array anhängen über Jsonb_set und Jsonb_array_length

Sieht aus wie jsonb_set Funktion erfüllen meine Anforderungen. Und für das neue Element anhängen muss ich nur Arrayindex maximieren und Element damit aktualisieren. Aber ich habe ein Problem damit. Machen wir es Schritt für Schritt. Wir haben Tabellenkampagnen mit jsonb field team_members.

select id, jsonb_set(team_members, '{0}', '{"name" : "123"}') from campaigns; 
id |  jsonb_set  
-----+------------------- 
102 | [{"name": "123"}] 

Okay gut, wenn gesetzt Pfad '{0}' statisch funktioniert alles. Lets für das Erhalten Feldlänge, die dynamisch

SQL tun (es unserem Index für Anfügen ist)

select '{' || jsonb_array_length(team_members) || '}'::text from campaigns; 
    ?column? 
    ---------- 
    {0} 

alle zusammen

select jsonb_set(team_members, '{' || jsonb_array_length(team_members) || '}', '{"name" : "123"}') from campaigns; 
Erste

ERROR: function jsonb_set (jsonb, Text, unbekannt) existiert nicht LINE 1: jsonb_set auswählen (team_members, '{' || jsonb_array_length (Tee ... ^ HINWEIS: Keine Funktion stimmt mit den angegebenen Namen und Argumenttypen überein. Sie könnten

müssen explizite Typ Umwandlungen hinzufügen.

Meine Frage ist - wie kann ich diesen Fehler loswerden? Was mache ich falsch?

Vielen Dank im Voraus. ?

+0

wenn Sie anhängen möchten, '' || ist besserer Kandidat für Sie –

+0

Sorry, i‘ Ich bin mir nicht sicher, ob ich dir gefolgt bin. Kannst du mir bitte ein Beispiel zeigen? – user1341596

+0

Zuerst habe ich dich nicht mit Index verstanden. Jetzt denke ich, dass ich es verstehe. und vorgeschlagenes Beispiel in Antwort –

Antwort

1

so etwas wie dieses ..

t=# with jpath as (select concat('{',0,'}')::text[] path) select jsonb_set('[]'::jsonb,path,'{"name": "123"}'::jsonb) from jpath; 
    jsonb_set 
------------------- 
[{"name": "123"}] 
(1 row) 

In Ihrem Fall sollte wie:

select 
    jsonb_set(
    team_members 
    , concat('{',jsonb_array_length(team_members),'}')::text[] 
    , '{"name" : "123"}' 
) 
from campaigns; 
+0

Großartig! Ich weiß nichts von concat. Nur ein Moment: concat ('{', jsonb_array_length (team_members), '}') :: text [] Sie nach Doppelpunkt vergessen) danke – user1341596

+0

@ user1341596 ja, gegossen, dank –

Verwandte Themen