К сожалению, Postgres json оператор -
поддерживает только строковые значения, как объяснено в документации :
операнд: -
тип правого операнда: text
описание: Удалить пару ключ / значение или строковый элемент из левого операнда. Пары ключ / значение сопоставляются на основе их значения ключа.
С другой стороны, если вы передаете целое значение в качестве правого операнда, Postgres считает его индексом элемент массива, который необходимо удалить.
Альтернативный вариант - разложить массив с помощью jsonb_array_elements()
и бокового соединения, отфильтровать нежелательное значение, а затем повторно агрегировать:
select jsonb_set(column_name, '{values}', new_values) new_column_name
from mytable t
left join lateral (
select jsonb_agg(val) new_values
from jsonb_array_elements(t.column_name -> 'values') x(val)
where val::int <> 33
) x on 1 = 1
Демонстрация на DB Fiddle :
with mytable as (select '{"values": [11, 22, 33]}'::jsonb column_name)
select jsonb_set(column_name, '{values}', new_values) new_column_name
from mytable t
left join lateral (
select jsonb_agg(val) new_values
from jsonb_array_elements(t.column_name -> 'values') x(val)
where val::int <> 33
) x on 1 = 1
| new_column_name |
| :------------------- |
| {"values": [11, 22]} |