如何在具有空值的列上使用`jsonb_set`
Posted
技术标签:
【中文标题】如何在具有空值的列上使用`jsonb_set`【英文标题】:How to use `jsonb_set` on column with null values 【发布时间】: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')
【参考方案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
配合良好。以上是关于如何在具有空值的列上使用`jsonb_set`的主要内容,如果未能解决你的问题,请参考以下文章