jsonb键/值追加可通过||操作符,如下增加sex键/值:
- mydb=> SELECT '{"name":"francs","age":"31"}'::jsonb ||
- '{"sex":"male"}'::jsonb;
- ?column?
- ------------------------------------------------
- {"age": "31", "sex": "male", "name": "francs"}
- (1 row)
jsonb键/值的删除有两种方法,一种是通过操作符号-删除,另一种通过操作符#-删除指定键/值。
通过操作符号-删除键/值如下:
- mydb=> SELECT '{"name": "James", "email": "james@localhost"}'::jsonb
- - 'email';
- ?column?
- -------------------
- {"name": "James"}
- (1 row)
- mydb=> SELECT '["red","green","blue"]'::jsonb - 0;
- ["green", "blue"]
第二种方法是通过操作符#-删除指定键/值,通常用于有嵌套json数据删除的场景,如下删除嵌套contact中的fax键/值:
- mydb=> SELECT '{"name": "James", "contact": {"phone": "01234 567890", "fax": "01987 543210"}}'::jsonb #- '{contact,fax}'::text;
- ?column?
- ---------------------------------------------------------
- {"name": "James", "contact": {"phone": "01234 567890"}}
- (1 row)
删除嵌套aliases中的位置为1的键/值,如下所示:
- mydb=> SELECT '{"name": "James", "aliases": ["Jamie","The Jamester","J Man"]}'::jsonb #- '{aliases,1}'::text;
- {"name": "James", "aliases": ["Jamie", "J Man"]}
- (1 row)
键/值的更新也有两种方式,第一种方式为||操作符,||操作符可以连接json键,也可覆盖重复的键值,如下修改age键的值:
- mydb=> SELECT '{"name":"francs","age":"31"}'::jsonb ||
- '{"age":"32"}'::jsonb;
- ?column?
- ---------------------------------
- {"age": "32", "name": "francs"}
- (1 row)
第二种方式是通过jsonb_set函数,语法如下:
- jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean])
target指源jsonb数据,path指路径,new_value指更新后的键值,create_missing 值为 true表示如果键不存在则添加,create_missing 值为 false表示如果键不存在则不添加,示例如下:
- mydb=> SELECT jsonb_set('{"name":"francs","age":"31"}'::jsonb,'{age}','"32"'::jsonb,false);
- jsonb_set
- mydb=> SELECT jsonb_set('{"name":"francs","age":"31"}'::jsonb,'{sex}','"male"'::jsonb,true);
7、给JSONB类型创建索引
这一小节介绍给jsonb数据类型创建索引,jsonb数据类型支持GIN索引,为了便于说明,假如一个json字段内容如下,并且以jsonb格式存储。
- {
- "id": 1,
- "user_id": 1440933,
- "user_name": "1_francs",
- "create_time": "2017-08-03 16:22:05.528432+08"
- }
假如存储以上jsonb数据的字段名为user_info,表名为tbl_user_jsonb,在user_info字段上创建GIN索引语法如下:
CREATE INDEX idx_gin ON tbl_user_jsonb USING gin(user_info); (编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|