Jeśli możesz uaktualnić do Postgresql 9.5, jsonb_set
polecenie jest dostępne, jak wspomnieli inni.
W każdej z poniższych instrukcji SQL pominąłem where
klauzula zwięzłości; oczywiście chciałbyś to dodać z powrotem.
Zaktualizuj nazwę:
UPDATE test SET data = jsonb_set(data, '{name}', '"my-other-name"');
Zastąp tagi (w przeciwieństwie do dodawania lub usuwania tagów):
UPDATE test SET data = jsonb_set(data, '{tags}', '["tag3", "tag4"]');
Zastąpienie drugiego tagu (0-indeksowane):
UPDATE test SET data = jsonb_set(data, '{tags,1}', '"tag5"');
Dołącz tag (to zadziała, o ile będzie mniej niż 999 tagów; zmiana argumentu 999 na 1000 lub wyższy powoduje błąd . Wydaje się, że nie ma to już miejsca w Postgresie 9.5.3; można zastosować znacznie większy indeks):
UPDATE test SET data = jsonb_set(data, '{tags,999999999}', '"tag6"', true);
Usuń ostatni tag:
UPDATE test SET data = data #- '{tags,-1}'
Kompleksowa aktualizacja (usuń ostatni tag, wstaw nowy tag i zmień nazwę):
UPDATE test SET data = jsonb_set(
jsonb_set(data #- '{tags,-1}', '{tags,999999999}', '"tag3"', true),
'{name}', '"my-other-name"');
Należy zauważyć, że w każdym z tych przykładów nie aktualizujesz w rzeczywistości pojedynczego pola danych JSON. Zamiast tego tworzysz tymczasową, zmodyfikowaną wersję danych i przypisujesz tę zmodyfikowaną wersję z powrotem do kolumny. W praktyce wynik powinien być taki sam, ale pamiętanie o tym powinno sprawić, że złożone aktualizacje, takie jak ostatni przykład, będą bardziej zrozumiałe.
W złożonym przykładzie istnieją trzy przekształcenia i trzy wersje tymczasowe:Najpierw usuwany jest ostatni znacznik. Następnie ta wersja jest przekształcana poprzez dodanie nowego tagu. Następnie druga wersja jest przekształcana poprzez zmianę name
pole. Wartość w data
kolumna zostaje zastąpiona wersją ostateczną.