如何在具有空值的列上使用“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')
我使用的是 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')