【问题标题】:How to use `jsonb_set` on column with null values如何在具有空值的列上使用`jsonb_set`
【发布时间】:2017-12-11 19:20:47
【问题描述】:

我正在使用 Postgres 9.6,并且我有一个 JSONB 列,其中一些行具有 NULL 值,而一些行具有像 {"notify": false} 这样的 dict 值。

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

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

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

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

您能否告诉我如何更新NULL 值,因此它们的最终结果将是{"notify": false} 之类的值。最终结果变成了预期的{"alerts": false}

【问题讨论】:

  • 你试过jsonb_set(coalesce(notifications,'{}'), '{"alerts"}', 'false')

标签: json postgresql jsonb postgresql-9.6


【解决方案1】:

使用coalesce():

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

甚至更简单:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 一些版本 - 在所有支持的版本中(截至今天 9.6+)coalesce()jsonb 配合良好。
    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 2021-03-31
    • 2020-02-27
    相关资源
    最近更新 更多