postgresql 常用操作命令 JSONB操作

本文展示了如何在PostgreSQL中使用psql命令行工具,包括登录、查看数据库、选择数据库和查询表。重点讨论了JSONB字段的处理,如更新、插入、查询和删除操作,以及处理NULL值的方法。还包含了嵌套JSON的数据操作实例,如路径替换、添加和删除值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

登录 类似于 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'

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆芽脚脚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值