Как изменить значение массива объектов jsonb для всей таблицы?

у меня есть таблица со столбцом JSONB, который называется columnsettings. Данные jsonb выглядят так:.

[
    {
        "data": "id",
        "width": 25
    },
    {
        "data": "field_1",
        "width": 125
    },
    {
        "data": "field_3",
        "width": 183
    },
    {
        "data": "field_11",
        "width": 125
    }
]

Теперь я хочу запустить обновление для всех строк в таблице и изменить атрибут данных = 'newvalue', где значение данных = 'field_1, например: ожидаемый результат для всех строк будет:

[
    {
        "data": "id",
        "width": 25
    },
    {
        "data": "newvalue",
        "width": 125
    },
    {
        "data": "field_3",
        "width": 183
    },
    {
        "data": "field_11",
        "width": 125
    }
]

Кажется, я не могу найти правильный синтаксис для обновления этого конкретного значения массива во всех строках таблицы. Любая помощь приветствуется.


person mike hennessy    schedule 04.02.2021    source источник
comment
Я думаю, вам нужно что-то вроде: UPDATE tbl SET json_obj = json_obj || json_build_object('data', '<some_value>'); Не знаю, как вы обрабатываете, какие данные получают какое значение. Это применит один и тот же <some_value> к каждой записи. Такая конкатенация уничтожит любой ранее существовавший кортеж "data":<value> в json.   -  person J Spratt    schedule 04.02.2021


Ответы (1)


Вы можете использовать функцию JSONB_SET(), вложенную в JSONB_AGG(), в операторе UPDATE, содержащем условное выражение, после разделения элементов массива с помощью применения функции JSONB_ARRAY_ELEMENTS(), такой как

UPDATE tab
   SET columnsettings =
   (
    SELECT JSONB_AGG(CASE WHEN j ->> 'data' = 'field_1' THEN 
                               JSONB_SET(j, '{data}', '"newvalue"')
                          ELSE
                               j
                           END)    
      FROM JSONB_ARRAY_ELEMENTS(columnsettings) AS j
   )

Демо

person Barbaros Özhan    schedule 04.02.2021