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

时间:2017-07-07 13:13:53

标签: json postgresql jsonb postgresql-9.6

我使用的是Postgres 9.6,我有一个JSONB列,其中一些行的值为NULL,有些行的值为{"notify": false}

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

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

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

但是我试图更新我们NULL的价值,数据库中没有更新任何内容。

您能否告诉我如何更新NULL值,因此最终结果将是{"notify": false}等值。最终结果符合预期{"alerts": false}

2 个答案:

答案 0 :(得分:11)

使用coalesce()

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

甚至更简单:

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

答案 1 :(得分:1)

请注意,某些版本的 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')