Pytanie Dołączanie (wypychanie) i usuwanie z tablicy JSON w PostgreSQL 9.5+


Dla wersji mniejszej niż 9,5 zobacz to pytanie

Stworzyłem tabelę w PostgreSQL, używając:

CREATE TEMP TABLE jsontesting
AS
  SELECT id, jsondata::jsonb FROM ( VALUES
    (1, '["abra","value","mango", "apple", "sample"]'),
    (2, '["japan","china","india", "russia", "australia"]'),
    (3, '["must", "match"]'),
    (4, '["abra","value","true", "apple", "sample"]'),
    (5, '["abra","false","mango", "apple", "sample"]'),
    (6, '["string","value","mango", "apple", "sample"]'),
    (7, '["must", "watch"]')
  ) AS t(id,jsondata);

Teraz chciałem

  • Dodaj Coś jak append_to_json_array przyjmuje rzeczywistą jsondatę, która jest tablicą json i newString, które muszę dodać do tablicy jsondata i ta funkcja powinna zwrócić zaktualizowaną tablicę json.

    UPDATE jsontesting
    SET jsondata=append_to_json_array(jsondata, 'newString')
    WHERE id = 7;
    
  • usunąć wartość z tablicy danych json, jedna funkcja do usuwania wartości.

Próbowałem przeszukać dokumentację PostgreSQL, ale niczego tam nie znalazłem.


14
2018-02-14 18:23


pochodzenie




Odpowiedzi:


Aby dodać wartość, użyj operatora dopełnienia tablicy JSON (||)

UPDATE jsontesting
SET jsondata = jsondata || '["newString"]'::jsonb
WHERE id = 7;

Usunięcie wartości wygląda następująco

UPDATE jsontesting
SET jsondata = jsondata - "newString"
WHERE id = 7; 

Konkatenacja do zagnieżdżonego pola wygląda następująco

UPDATE jsontesting
SET jsondata = jsonb_set(
  jsondata::jsonb,
  array['nestedfield'],
  (jsondata->'nestedfield')::jsonb || '["newString"]'::jsonb) 
WHERE id = 7;

23
2018-02-14 18:23



Jaka jest wydajność w przypadku dołączania do już bardzo dużych tablic? Czy postgres musi załadować cały wiersz? - Rollo
Za każdym razem, gdy aktualizujesz kolumnę, PostgreSQL musi aktualizować cały wiersz. - Evan Carroll
czy możesz mi podać źródło? Chciałbym tylko trochę w to zagłębić. - Rollo
@Rollo cokolwiek MVCC. Tak to wszystko działa. Rozwiązuje problem izolacji. Gdy aktualizujesz wiersz, ten wiersz nie może być widoczny dla żadnej transakcji przed zatwierdzeniem, ale musi być widoczny dla twojej transakcji. Więc piszesz ten wiersz na stole jako martwy rząd. Kiedy zobowiążesz się, że zrobisz to na żywo. Dopóki nie zatwierdzisz, inne transakcje wyświetlają wiersz w jego poprzednim stanie. - Evan Carroll
Jest literówka. SET jsondata = jsondata - "newString" powinno być SET jsondata = jsondata - '"newString"' - Cody Canning


Aby dodać do odpowiedzi Evan Carroll, możesz wykonać następujące czynności, aby ustawić kolumnę do pustej tablicy, jeśli tak jest NULL. Operator append (||) nic nie robi, jeśli kolumna jest obecnie NULL.

UPDATE jsontesting SET jsondata = (
    CASE
        WHEN jsondata IS NULL THEN '[]'::JSONB
        ELSE jsondata
    END
) || '["newString"]'::JSONB WHERE id = 7;

0
2018-05-02 21:41



Chciałbym użyć koalescencji lub zapisać ją w warunku. - Evan Carroll