PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak zmodyfikować lub usunąć określony obiekt JSON z tablicy JSON przechowywanej w kolumnie typu jsonb w PostgreSQL przy użyciu klauzuli where?

Oba problemy wymagają rozgnieżdżenia i agregacji (zmodyfikowanych) elementów JSON. W przypadku obu problemów utworzyłbym funkcję, która ułatwiłaby korzystanie z niej.

create function remove_element(p_value jsonb, p_to_remove jsonb)
  returns jsonb
as
$$
  select jsonb_agg(t.element order by t.idx)  
  from jsonb_array_elements(p_value) with ordinality as t(element, idx)
  where not t.element @> p_to_remove;
$$
language sql
immutable;

Funkcja może być używana w ten sposób, np. w oświadczeniu UPDATE:

update the_table
  set the_column = remove_element(the_column, '{"ModuleId": 1}')
where ...

W przypadku drugiego problemu przydatna jest podobna funkcja.

create function change_value(p_value jsonb, p_what jsonb, p_new jsonb)
  returns jsonb
as
$$
  select jsonb_agg(
         case
           when t.element @> p_what then t.element||p_new
           else t.element
         end order by t.idx)  
  from jsonb_array_elements(p_value) with ordinality as t(element, idx);
$$
language sql
immutable;

|| operator nadpisze istniejący klucz, co skutecznie zastąpi starą nazwę nową nazwą.

Możesz go użyć w ten sposób:

update the_table
  set the_column = change_value(the_column, '{"ModuleId": 1}', '{"ModuleName": "CBA"}')
where ...;

Myślę, że przekazywanie wartości JSON jest nieco bardziej elastyczne niż zakodowanie kluczy na sztywno, co sprawia, że ​​korzystanie z funkcji jest bardzo ograniczone. Pierwsza funkcja może być również użyta do usunięcia elementów tablicy przez porównanie wielu kluczy.

Jeśli nie chcesz tworzyć funkcji, zastąp wywołanie funkcji select z funkcji.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. postgresql:INSERT INTO ... (WYBIERZ * ...)

  2. Transakcja nie obsługuje równoległych poleceń za pośrednictwem Task.WhenAll

  3. \d nie powiodło się w programie jdbc

  4. Django - Wyszukiwanie pełnotekstowe - Wildcard

  5. Czy w PostgreSQL wiele UPDATE różnych wierszy w tej samej tabeli ma sprzeczne blokady?