如何在具有空值的列上使用“jsonb_set”

How to use `jsonb_set` on column with null values

我使用的是 Postgres 9.6,我有一个 JSONB 列,其中一些行具有 NULL 值,一些行具有字典值,例如 {"notify": false}.

我想用更多字典 key/value 对更新列值。

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

适用于我已经拥有 {"notify": false} 等值的情况。最终结果变成了预期的{"alerts": false, "notifications": false}.

但是我正在尝试更新我们的值 NULL,数据库中没有任何更新。

你能告诉我如何更新 NULL 值吗,所以它们的最终结果将是像 {"notify": false} 这样的值。最终结果变成了预期的{"alerts": false}

使用coalesce():

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

或更简单:

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

请注意,某些版本的 Postgres 具有不支持 jsonb 的 coalesce() 函数,并且在尝试使用已接受的答案时会出现这样的错误:

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')