Как использовать `jsonb_set` в столбце с нулевыми значениями

Я использую Postgres 9.6, и у меня есть столбец JSONB, в котором некоторые строки имеют значение NULL, а некоторые имеют значения dict, такие как {"notify": false}.

Я хочу обновить значения столбцов с помощью большего количества пар ключ/значение словаря.

UPDATE accounts SET notifications =  jsonb_set(notifications, '{"alerts"}', 'false');

Работает для случаев, когда у меня уже есть такие значения, как {"notify": false}. Конечный результат становится ожидаемым {"alerts": false, "notifications": false}.

Но значение, которое я пытаюсь обновить, у нас NULL, в бд ничего не обновляется.

Можете ли вы дать мне какие-либо идеи, как я могу также обновить значения NULL, чтобы конечным результатом для них были такие значения, как {"notify": false}. Конечный результат соответствует ожиданиям {"alerts": false}


person iffi    schedule 07.07.2017    source источник
comment
Вы пробовали jsonb_set(coalesce(notifications,'{}'), '{"alerts"}', 'false')   -  person a_horse_with_no_name    schedule 07.07.2017


Ответы (2)


Используйте coalesce():

UPDATE accounts 
SET notifications =  jsonb_set(coalesce(notifications, '{}'), '{"alerts"}', 'false')

или еще проще:

UPDATE accounts 
SET notifications =  coalesce(notifications, '{}') || '{"alerts": false}'
person klin    schedule 07.07.2017

Обратите внимание, что в некоторых версиях Postgres есть функции Coalesce(), которые не поддерживают jsonb, и при попытке использовать принятый ответ выдают такую ​​ошибку:

ERROR:  function coalsece(jsonb, unknown) does not exist

Вы можете обойти это, используя вместо этого оператор case. Некрасиво, но работает.

UPDATE accounts 
SET notifications = 
  jsonb_set(
    case
      when notifications is null then '{}'
      else notifications
    end,
    '{"alerts"}','false')
person sql_knievel    schedule 19.07.2021