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.