如何在具有空值的列上使用`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`的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spark/Scala 中查找具有许多空值的列

如何获取sql中给定行具有空值的列数?

PostgreSQL 查询列上具有最小空值的行

如何获取数据集中具有空值的列的总数? [复制]

使用 Java 在 Spark Data Frame 中添加空值列

如何在laravel中使用逗号分隔值的列上使用'where'