在 PostgreSQL 中修改 JSON 内部数组,其实也很简单!

数据库 PostgreSQL
我们可以使用jsonb_array_elements​函数,将 JSON 数组转换为行集合。然后可以用普通的 WHERE 条件对行集合进行过滤。在过滤后,将结果集传递给array()​构造函数,转换回数组。

PostgreSQL 没有提供直接可用的 JSON 内嵌数组的修改操作。通过将一些 JSON 实用函数与数组函数结合使用,您可以构造动态更新语句,来执行按值添加/删除数组元素的操作。

示例

让我们创建一个简单的 user 表,其中包含 id、username 和 metadata 属性,metadata 属性的类型为 jsonb:

CREATE TABLE users (
    id serial PRIMARY KEY,
    username TEXT NOT NULL,
    meta_data JSONB NOT NULL DEFAULT '{}'::jsonb
);

INSERT INTO users (username, meta_data)
VALUES ('johndoe', '{"roles": ["hr", "marketing", "sales"]}'::jsonb);

SELECT id, username, meta_data FROM users;

输出结果为:

id | username |                meta_data
----+----------+-----------------------------------------
  1 | johndoe  | {"roles": ["hr", "marketing", "sales"]}
(1 row)

添加元素

让我们将 “development” 和 “administration” 角色添加到用户的 roles 数组中:

UPDATE users
SET meta_data = jsonb_set(meta_data, ARRAY['roles'],
    COALESCE(meta_data->'roles', '[]'::jsonb) ||
    array_to_json(ARRAY['development', 'administration'])::jsonb)
WHERE id = 1;

添加相当简单。函数jsonb_set将要更新的 json 结构作为第一个参数,将一个指向要更新的部分的标识符/索引的 PostgreSQL 数组作为第二个参数,将新值作为第三个参数。您甚至可以通过数组下标,定位到用户的第一个角色,并将其替换为新值:

UPDATE users
SET meta_data = jsonb_set(meta_data, '{roles,0}', '"administration"'::jsonb)
WHERE id = 1;

删除元素

删除一个角色会稍微复杂一些:

UPDATE users
SET meta_data = jsonb_set(meta_data, ARRAY['roles'],
    array_to_json(
        array(
            SELECT arr.elem
                FROM jsonb_array_elements(meta_data->'roles')
                     WITH ordinality arr(elem, position)
                WHERE arr.elem != '"administration"'::jsonb)
        )::jsonb)
WHERE id = 1;

我们可以使用jsonb_array_elements函数,将 JSON 数组转换为行集合。然后可以用普通的 WHERE 条件对行集合进行过滤。在过滤后,将结果集传递给array()构造函数,转换回数组。之后,我们可以对新的数组应用array_to_json函数,将其转换回 JSON 数组。

责任编辑:武晓燕 来源: 红石PG
相关推荐

2018-12-24 08:46:52

Kubernetes对象模型

2015-08-27 09:30:38

2010-09-29 14:48:16

2024-05-17 08:56:59

PostgreSQLID回卷

2018-12-05 10:26:43

服务器HFSIIS

2009-08-25 12:37:38

个人服务器架设

2010-05-07 15:23:52

Oracle系统性能

2013-08-30 10:56:18

Windows 8.1

2024-05-28 07:58:49

PostgreSQL优化器关系级

2013-09-30 10:11:40

Windows 8技巧

2023-09-11 08:30:30

Creator工厂方法

2017-11-06 16:30:33

开源

2021-10-28 19:35:48

Go 控制超时

2015-03-02 14:39:07

MySQLMySQL复制

2017-06-01 14:00:17

路由器桥接路由WDS

2024-09-29 09:47:31

SQLAPI版本

2011-01-05 09:19:50

清洁数据中心

2013-06-07 17:46:31

Windows 8Windows 8.1

2023-11-08 08:43:08

calc函数CSS

2010-07-09 15:31:25

SQL Server
点赞
收藏

51CTO技术栈公众号