arrays - 更新列表 Postgres jsonb 中的值
问题描述
我正在尝试更新 json
[{"id": "1", "name": "myconf", "icons": "small", "theme": "light", "textsize": "large"},
{"id": 2, "name": "myconf2", "theme": "dark"}, {"name": "firstconf", "theme": "dark", "textsize": "large"},
{"id": 3, "name": "firstconxsf", "theme": "dassrk", "textsize": "lassrge"}]
这是包含该 json 列的表:
CREATE TABLE USER_CONFIGURATIONS ( ID BIGSERIAL PRIMARY KEY, DATA JSONB );
添加新字段很容易我正在使用:
UPDATE USER_CONFIGURATIONS
SET DATA = DATA || '{"name":"firstconxsf", "theme":"dassrk", "textsize":"lassrge"}'
WHERE id = 9;
但是如何使用 id = 1 或 2 更新单
解决方案
UPDATE users -- 4
SET data = s.updated
FROM (
SELECT
jsonb_agg( -- 3
CASE -- 2
WHEN ((elem ->> 'id')::int IN (1,2)) THEN
elem || '{"name":"abc", "icon":"HUGE"}'
ELSE elem
END
) AS updated
FROM
users,
jsonb_array_elements(data) elem -- 1
) s;
- 将数组元素分别展开为一行
- 如果元素有相关的id,用
||
操作符更新;如果没有,请保留原件 - 更新 JSON 数据后重新聚合数组
- 执行
UPDATE
语句。
推荐阅读
- c# - 带有列表的 C# 泛型
- google-cloud-platform - Google Cloud SQL:不支持的 XML 功能
- c# - 在 Mailjet API 中添加回复电子邮件标题
- angular - 可观察定义的含义是什么?
- azure - U-Sql 不允许非等值连接
- python - Beautifulsoup 如果类存在
- java - JavaFX获取旋转的imageView的角坐标?
- python - Python更改现有Windows快捷方式的图标
- sentry - 哨兵报错时如何查找线路?
- javascript - 你如何将数据从一个字段复制到另一个字段并在javascript中附加一个文本字符串