postgresql 将值附加到json数组

zbdgwd5y  于 2022-11-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(252)

我有一个postgresql表profile,其中包含列(usernamefriends)。username是一个字符串,friends是一个json类型,当前值为["Mary", "Bob]。我想在数组末尾追加一个项,使其为["Mary", "Bob", "Alice"]
我目前已经试过:

UPDATE profile SET friends = friends || '["Alice"]'::jsonb WHERE username = 'David';

这将产生以下错误:

[ERROR] 23:56:23 error: operator does not exist: json || jsonb

我尝试将第一个表达式更改为包含json而不是jsonb,但随后出现错误:

[ERROR] 00:06:25 error: operator does not exist: json || json

其他的答案似乎暗示了||运算符实际上是一个事物,例如:
Appending (pushing) and removing from a JSON array in PostgreSQL 9.5+
如何将一个项目追加到json数组的末尾?

4nkexdtk

4nkexdtk1#

数据类型jsonjsonb的限制要多得多。使用jsonb而不是json,您找到的解决方案就能简单地工作。
在使用json时,可能的解决方法是转换为jsonb,然后再转换回来:

UPDATE profile
SET    friends = (friends::jsonb || '["Alice"]')::json
WHERE  username = 'David';

您也可以为jsonb '["Alice"]'使用显式类型,但这是可选的。虽然表达式是明确的,但无类型的字符串文字将自动强制为jsonb。如果您提供一个有类型的值来代替'["Alice"]',则可能需要显式转换。
如果friends可以是NULL,那么您将需要定义应该发生什么。目前,什么都没有发生。或者,确切地说,一个不改变NULL值的更新。
同样,如果只有简单的字符串数组,可以考虑普通的Postgres array type text[]

相关问题