postgresql 常用操作命令 JSONB操作 您所在的位置:网站首页 字典嵌套列表好处 postgresql 常用操作命令 JSONB操作

postgresql 常用操作命令 JSONB操作

#postgresql 常用操作命令 JSONB操作| 来源: 网络整理| 查看: 265

登录 类似于 mysql -uroot -p

psql -U postgre postgre:用户名

查看数据库 类似于show databases

\l 在这里插入图片描述

选中数据库 类似于use hsrg

在这里插入图片描述

查看数据库表 类似于 show tables

在这里插入图片描述

HAVING

SELECT NAME FROM COMPANY GROUP BY name HAVING count(name) > 1; 必须再group by后面,相当于分组完成之后加判断条件

当jsonb字段为空时,直接使用json_set无法更新成功

首先发现,当字段为null时,怎么修改都不好使,提示成功,查询却没有。但是如果字段给输入{}时却可以更新成功,那就先给他处理下。

#可以更新、插入jsonb的单个值 UPDATE hs_report_task SET extend_param = coalesce(extend_param::jsonb,'{}'::jsonb) || '{"array":[{"bb":"cc"}]}'::jsonb where id = '017544b27e9a427f87cfd3a757b01ed4'; #返回值如果为空,则直接返回{},否则返回该字段值 select coalesce(extend_param::jsonb,'{}'::jsonb) from hs_report_task #返回值,如果为空返回{},否则返回||后面的值 select coalesce(extend_param::jsonb,'{}'::jsonb) || '{"array":[{"bb":"cc"}]}'::jsonb from hs_report_task #直接覆盖更新,不是我要的,这种直接再见 UPDATE hs_report_task SET extend_param = '{"dd":"kk"}'::jsonb where id = '062ecbf98ed14aa29e5875ecce36cdfe'; 嵌套的JSON查询 INSERT INTO test (uid, tooldata) VALUES (3, '{ "a": [{ "b": "ccccc", "d": [{ "e": "eeeee", "f": { "g": "ggggggggggg", "h": "HHHHHHHHHHHHHH" } }, { "e": "fffffffff", "f": { "g": "rrrrrrrrrr", "h": "66666666666" } }] }, { "b": "ccccc", "d": [{ "e": "eeeee", "f": { "g": "TTTTTTTTT", "h": "UUUUUUU" } }, { "e": "QQQQQQQQ", "f": { "g": "WWWWWWWWW", "h": "4444444444" } }] }] }'); #获取items 中的 a 数组对象: 得到结果为一行的jsonb 的数组格式 select tooldata ->> 'a' from test; #获取a数组对象中的d数组对象:得到结果为d的jsonb的数组格式,由于第二步中a中的数组分为两行 所以会有两行的d的jsonb的数组格式 select jsonb_array_elements((tooldata ->> 'a')::jsonb)->>'d' from test; #第三步中的结果为数组格式,则如同第二步操作一样,转换为jsonb 格式后拆分数组转化为多行对象 得到的结果为四行的d中的对象 select jsonb_array_elements((jsonb_array_elements((tooldata ->> 'a')::jsonb)->>'d')::jsonb) from test; #获取d对象中的f对象 得到的结果为四行的f对象 select jsonb_array_elements((jsonb_array_elements((tooldata ->> 'a')::jsonb)->>'d')::jsonb)->>'f' from test; #在获取了单层的对象后就可以结合jsonb的查询操作进行对数据的筛选 先通过子查询 将 items字段转化为多行的f对象 select (jsonb_array_elements((jsonb_array_elements((tooldata ->> 'a')::jsonb)->>'d')::jsonb)->>'f')::jsonb->>'h' from test; #路径替换值 select jsonb_set(tooldata,'{a,0,b}','"test"') from test where uid=3 #路径添加值,添加一个JSON数据 select jsonb_set(tooldata,'{a,0,d,3}','{"test":"test1"}') from test where uid=3

依次输出 ???在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

jsonb数组更新操作 #更新字段 UPDATE hs_report_task SET extend_param = coalesce(extend_param::jsonb,'{}'::jsonb) || '{"test":[{"uid": 1, "name": "标签名1", "add_time": "2021-05-29 17:00:00"}, {"uid": 2, "name": "标签名2", "add_time": "2021-05-29 17:00:00"}]}'::jsonb where id = '062ecbf98ed14aa29e5875ecce36cdfe'; #查询字段结果 {"dd": "kk", "hr": "12", "test": [{"uid": 1, "name": "标签名1", "add_time": "2021-05-29 17:00:00"}, {"uid": 2, "name": "标签名2", "add_time": "2021-05-29 17:00:00"}]} #更新,按路径更新,这种方法不可取,毕竟需要知道去确切的路径 update test set tooldata = jsonb_set(tooldata,'{a,0,d,3}','{"test":"test1"}') from test where uid=3 #刪除路徑上的一個值 update test set tooldata = tooldata #- '{a,0,d,0,f,g}' where uid=3 #删除前 { "a": [{ "b": "ccccc", "d": [{ "e": "eeeee", "f": { "g": "ggggggggggg", #删除的值 "h": "HHHHHHHHHHHHHH" } }, { "e": "fffffffff", "f": { "g": "rrrrrrrrrr", "h": "66666666666" } }, { "test": "test4" }, { "test": "test3" }] }, { "b": "ccccc", "d": [{ "e": "eeeee", "f": { "g": "TTTTTTTTT", "h": "UUUUUUU" } }, { "e": "QQQQQQQQ", "f": { "g": "WWWWWWWWW", "h": "4444444444" } }] }] } #删除后 { "a": [{ "b": "ccccc", "d": [{ "e": "eeeee", "f": { "h": "HHHHHHHHHHHHHH" } }, { "e": "fffffffff", "f": { "g": "rrrrrrrrrr", "h": "66666666666" } }, { "test": "test4" }, { "test": "test3" }] }, { "b": "ccccc", "d": [{ "e": "eeeee", "f": { "g": "TTTTTTTTT", "h": "UUUUUUU" } }, { "e": "QQQQQQQQ", "f": { "g": "WWWWWWWWW", "h": "4444444444" } }] }] } #以下为一个测试代码 select (jsonb_array_elements((tooldata ->> 'a')::jsonb)->>'d')::jsonb from test where uid = 3; select (jsonb_array_elements((tooldata ->> 'a')::jsonb)->>'d')::jsonb-0 from test where uid = 3; select (jsonb_array_elements((tooldata ->> 'a')::jsonb)->>'d')::jsonb-1 from test where uid = 3; select (jsonb_array_elements((tooldata ->> 'a')::jsonb)->>'d')::jsonb-2 from test where uid = 3; select (jsonb_array_elements((tooldata ->> 'a')::jsonb)->>'d')::jsonb-3 from test where uid = 3; select (jsonb_array_elements((tooldata ->> 'a')::jsonb)->>'d')::jsonb-4 from test where uid = 3; select (jsonb_array_elements((tooldata ->> 'a')::jsonb)->>'d')::jsonb from test where uid = 3; SELECT (jsonb_array_elements((tooldata ->> 'a')::jsonb)->>'d')::jsonb #- '{0,f,g}' from test where uid = 3; select (jsonb_array_elements((tooldata ->> 'a')::jsonb)->>'d')::jsonb from test where uid = 3; 通过replace实现的jsonb更新 create table purchase_order ( id serial not null primary key, tag jsonb ) INSERT INTO purchase_order (id, tag) VALUES (4787, '[{"uid": 1, "name": "标签名1", "add_time": "2021-05-29 17:00:00"}, {"uid": 2, "name": "标签名2", "add_time": "2021-05-29 17:00:00"}]'); select *from purchase_order -- 嵌套子查询 select * from ( select jsonb_array_elements(tag) as tt from purchase_order where id = 4787) a where tt -> 'uid' = '1'; -- 或者这种方式 SELECT id,r FROM purchase_order s, jsonb_array_elements(s.tag) r WHERE s.id = 4787 and r->>'uid' = '2' ; UPDATE purchase_order SET tag = tag || '[{ "uid": 3, "name": "标签名3", "add_time": "2021-05-29 17:00:00" }]' where id = 4787; SELECT tag FROM purchase_order WHERE id = 4787 and tag @> '[{"uid": 3}]'; -- 更新操作,这种也可行,但是不是我想要的,仅仅记录。 UPDATE purchase_order AS g SET tag = REPLACE(tag::text, '"name": "标签名1"','"name": "标签new"')::json WHERE g.tag IN ( SELECT g.tag FROM purchase_order AS g CROSS JOIN jsonb_array_elements(g.tag) AS j WHERE id = 4787 and j ->>'uid' = '1' ) JSONB的遍历显示 CREATE TABLE person(id serial, info jsonb); INSERT INTO person (info) VALUES ('{"num":"1","name":"张三","score":"90"}'::jsonb); SELECT t.* FROM person, jsonb_to_record(info) AS t(num text, name text, score text); # 更新的操作,目前还没看懂 UPDATE person t1 SET info = jsonb_set(info, array[(SELECT ORDINALITY::INT - 1 FROM person t2, jsonb_array_elements(info) WITH ORDINALITY WHERE t1.id = t2.id AND value->>'num' = '1')::text, 'score'::text], '"92"') WHERE id = '1'

在这里插入图片描述 在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有