首页 > 数据库 >postgresql【JSONB用法】

postgresql【JSONB用法】

时间:2023-10-20 17:46:27浏览次数:48  
标签:postgresql JSONB -- 用法 json table my your jsonb

//userName type code 是我拿到数据结构出来的 可以写固定值来测试;code字段为上面设置的唯一约束。如果code值没有变就是修改,否则就是新增
INSERT INTO 表名(username, type, code) 
VALUES('${userName}', '${type}', '${code}') 
ON CONFLICT     9.6语法支持
(code) DO UPDATE 
SET username = '${userName}',
type = '${type}',
code = '${code}'

















-- 在PostgreSQL中,可以使用以下语法来操作JSON类型的数据: 
 
-- 1. 读取JSON字段的值:
SELECT my_json -> 'a' FROM 表名;
-- 这将返回JSON字段中指定键的值。 
 
-- 2. 读取JSON字段的某个属性值:
SELECT my_json -> 'key' -> 'subkey' FROM your_table;
-- 这将返回JSON字段中指定键和子键的值。 
 
-- 3. 更新JSON字段的值:

UPDATE your_table SET test_json = '{"b":1111}'   WHERE id=2;

UPDATE tenant_data_recordSET ext = jsonb_set (  ext,  '{update_category}',  '2')


-- 这将在原有JSON字段的基础上添加或更新指定键的值。 
 
-- 4. 添加新的键值对到JSON字段:
UPDATE your_table SET my_json = '{"b": 1, "a": 3}'  where your_table.id=1;
-- 这将在原有JSON字段的基础上添加新的键值对。 
 
-- 5. 删除JSON字段的键值对:
UPDATE your_table SET my_json = my_json - 'a'  where your_table.id=1;
-- 这将删除JSON字段中指定键的键值对。 



-- 以下是使用PostgreSQL操作JSON类型数据的一些示例: 
--  
-- 1. 读取JSON字段的值:
-- sql
-- SELECT json_column->'key' FROM table_name;
-- 这将返回JSON字段中指定键的值。 
--  
-- 2. 读取JSON字段的某个属性值:
-- sql
-- SELECT json_column->'key'->'subkey' FROM table_name;
-- 这将返回JSON字段中指定键和子键的值。 
--  
-- 3. 更新JSON字段的值:
-- sql
-- UPDATE table_name SET json_column = json_column || '{"key": "new_value"}' WHERE condition;
-- 这将在原有JSON字段的基础上添加或更新指定键的值。 
--  
-- 4. 添加新的键值对到JSON字段:
-- sql
-- UPDATE table_name SET json_column = json_column || '{"new_key": "new_value"}' WHERE condition;
-- 这将在原有JSON字段的基础上添加新的键值对。 
--  
-- 5. 删除JSON字段的键值对:
-- sql
-- UPDATE table_name SET json_column = json_column - 'key' WHERE condition;
-- 这将删除JSON字段中指定键的键值对。 
--  
-- 请注意,以上示例是基于使用PostgreSQL的JSON类型字段操作。如果使用的是JSONB类型字段,则可以使用更多高级的JSON操作函数和运算符。确保将示例中的表名、字段名和条件修改为实际使用的名称,并根据实际需求进行适当的调整。







INSERT INTO "file_manage_v2"."your_table" (
	"splan_id",
	"planname",
	"authstatus",
	"authuser_id",
	"authuser_nickname",
	"createuser_id",
	"createuser_nickname",
	"create_time",
	"update_time",
	"deleted",
	"skip_big",
	"skip_security",
	"my_json",
	"my_json" 
)
VALUES
	(
		2,
		'2',
		'2',
		2,
		'2',
		1,
		'2',
		'2023-10-16 11:25:30',
		'2023-10-16 11:25:30',
		0,
		0,
		0,
		'{"b": 3, "a": 4}',
	NULL 
	) ON CONFLICT (authuser_id,authuser_nickname,createuser_id)
	DO UPDATE
	SET authuser_id =2,authuser_nickname = '2',	createuser_id = 1;



INSERT INTO 表名(username, type, code) 
VALUES('${userName}', '${type}', '${code}') 
ON CONFLICT     9.6语法支持
(code) DO UPDATE 
SET username = '${userName}',
type = '${type}',code = '${code}'



成功案例:冲突键检测  需要有唯一索引才能生效
INSERT INTOyour_table ( "batch_code", "batch_cancel", "create_time", "update_time", "deleted") VALUES ('1', 1, '2023-10-16 16:49:01', NULL, 0)
	    (batch_code)	DO UPDATE
	SET batch_cancel =2;





--修改某个值
UPDATE your_table
SET test_json = jsonb_set(test_json, '{b}', '6'::jsonb)
WHERE id = 1;

-- 某个属性不存在 添加字段

UPDATE your_table
SET test_json = jsonb_set(test_json, '{sss}', '6'::jsonb)
WHERE id = 1;



ALTER TABLE your_table  ADD COLUMN test_json  jsonb ;
--  已经存在数据不可修改字段类型
ALTER TABLE your_table ALTER COLUMN my_json TYPE jsonb;
-- 固有字段 改变字段类型
ALTER TABLE your_table ALTER COLUMN my_json TYPE jsonb  USING (my_json::jsonb)

ALTER TABLE your_table ALTER COLUMN my_json TYPE jsonb  USING (my_json::jsonb);
ALTER TABLE your_table ALTER COLUMN my_json TYPE jsonb  USING (my_json::jsonb);

ALTER TABLE file_manage_v2.t_fm_auth_plan ALTER COLUMN audit_objective_json TYPE jsonb  USING (audit_objective_json::jsonb);


清除表的数据
   truncate your_table; 


-- 为空取新值,不为空给个默认值
UPDATE your_table
SET my_json = jsonb_set(
    my_json,
    '{b}',
    COALESCE(my_json->'b', '6'::jsonb, '0'::jsonb)
)
WHERE id=1;
WHERE <condition>;







在 PostgreSQL 中,可以使用内置的 JSONB 函数和操作符来对 JSONB 类型的字段进行加减运算。以下是一些常用的方法示例: 
 
1. 对 JSONB 字段的属性进行加法运算:
sql
------------------失效
UPDATE your_table
SET your_column = your_column || jsonb_build_object('your_property', (your_column->>'your_property')::numeric + 1)
WHERE <condition>;
在上面的示例中, your_table  是你的表名, your_column  是包含 JSONB 数据的列名, your_property  是要进行加法运算的属性名。通过使用  jsonb_build_object  函数和操作符  || ,将属性的值加 1,并将更新后的 JSONB 值存回原来的字段中。 
 
2. 对 JSONB 字段的属性进行减法运算:
sql
------------------失效
UPDATE your_table
SET your_column = your_column || jsonb_build_object('your_property', (your_column->>'your_property')::numeric - 1)
WHERE <condition>;
----------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------
-- 对JSONB的属性进行加减操作

postgresql 对JSONB属性为空的给个默认值,不为空的进行累加

-- 直接相加
UPDATE your_table
   SET my_json = jsonb_set(my_json, '{b}', to_jsonb((my_json ->>'b') :: numeric + 5))
 where id = 1;

--为空就给个0,然后相加,不为空直接相加
UPDATE your_table
   SET my_json = jsonb_set(my_json, '{b}',to_jsonb( COALESCE((my_json ->> 'b') :: numeric, 0) + 5))
 WHERE id = 1;

在上面的示例中, your_table  是你的表名, your_column  是包含 JSONB 数据的列名, your_property  是要进行减法运算的属性名。通过使用  jsonb_build_object  函数和操作符  || ,将属性的值减 1,并将更新后的 JSONB 值存回原来的字段中。 
 
请注意,以上示例中的  <condition>  部分需要根据你的具体需求进行修改,以指定更新的条件。

-- 直接相加
UPDATE your_table
   SET my_json = jsonb_set(my_json, '{b}', to_jsonb((my_json ->>'b') :: numeric + 5))
 where id = 1;





--为空就给个0,然后相加,不为空直接相加
UPDATE your_table
   SET my_json = jsonb_set(my_json, '{b}',to_jsonb( COALESCE((my_json ->> 'b') :: numeric, 0) + 5))
 WHERE id = 1;
 
 
 UPDATE your_table
   SET my_json = jsonb_set(my_json, '{b}',to_jsonb( COALESCE((my_json ->> 'b') :: numeric, 0) - 5))
 WHERE id = 1;

 UPDATE your_table
   SET my_json = jsonb_set(my_json, '{waitAudit}',to_jsonb( COALESCE((my_json ->> 'waitAudit') :: numeric, 0) -1))
 WHERE id = 2;




同时变更多个字段 (仅限于直接改变属性值,不适合做运算)
UPDATE your_table
   SET my_json=my_json::jsonb|| '{"ss": 1, "b": 1, "拟控制": 1, "a": 1}'::jsonb
 WHERE id =1;



同时变更多个字段并进行运算
 UPDATE your_table
SET my_json = jsonb_set(
  jsonb_set(
    my_json,
    '{ss}',
    to_jsonb(COALESCE((my_json->>'ss')::int, 0) + 5)
  ),
  '{b}',
  to_jsonb(COALESCE((my_json->>'b')::int, 0) - 1)
)
WHERE id=1;




在 PostgreSQL 中,单引号和双引号具有不同的含义和用途。基本区别如下:

单引号:表示字符串值。在 SQL 查询中,字符串通常使用单引号括起来。例如,’Hello World’。
双引号:表示标识符或对象名称。标识符可以是表名、列名、数据库名等。双引号使得标识符区分大小写,并且可以包含特殊字符或保留字。例如,”Table_Name”。




















postgresql处理jsonb类型字段多个属性进行算术运算
 List<JSONObject> jsonObjectList = new ArrayList<>();
        jsonObjectList.add(JSON.parseObject("{'key':'ss','value':1}"));
//        jsonObjectList.add(JSON.parseObject("{'key':'b','value':2}"));
//        jsonObjectList.add(JSON.parseObject("{'key':'a','value':3}"));
        StringBuilder  finalList = new StringBuilder();
        int size = jsonObjectList.size();
        if (size == 1) {
            for (JSONObject jsonObject : jsonObjectList) {
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.append("my_json = jsonb_set(my_json");
                String key = jsonObject.getString("key");
                int value = jsonObject.getIntValue("value");
                stringBuilder.append(", '{" + key + "}',to_jsonb( COALESCE((my_json ->> '" + key + "') :: numeric, 0) + " + value + ")");
                stringBuilder.append(")");
                finalList.append(stringBuilder);
            }
        }else if(size>1){
             for(int i = 0; i < jsonObjectList.size(); i++) {
                StringBuilder stringBuilder = new StringBuilder();
                if(i==jsonObjectList.size()-1){
                    stringBuilder.append("my_json = jsonb_set(");
                }else if(i==0){
                    stringBuilder.append(" jsonb_set(my_json");
                }else{
                    stringBuilder.append(" jsonb_set(");
                }
                String key = jsonObjectList.get(i).getString("key");
                int value = jsonObjectList.get(i).getIntValue("value");
                stringBuilder.append(finalList);
                stringBuilder.append(", '{" + key + "}',to_jsonb( COALESCE((my_json ->> '" + key + "') :: numeric, 0) + " + value + ")");
                stringBuilder.append(")");
                finalList.delete(0,finalList.length());
                finalList.append(stringBuilder);
            }
        }
        System.out.println(">>>>>>>>>>>>>>>>>:"+finalList);
然后把拼接的sql放入更新语句
 userDao.update(null, new UpdateWrapper<User>().lambda()
                    .eq(User::getPlanId, planId).eq(User::getCreateuserId, userId).setSql(finalList.toString()));
https://blog.csdn.net/qq_35987023/article/details/132173013
https://blog.csdn.net/weixin_42800689/article/details/91413254

  

标签:postgresql,JSONB,--,用法,json,table,my,your,jsonb
From: https://www.cnblogs.com/wangbiaohistory/p/17777622.html

相关文章

  • RestTemplate 用法总结
    一、RestTemplate是什么?   如果某个服务想获取其他服务的数据的时候,一般会用到RestTemplate,这是一种HTTP请求调用的工具二、如何使用?   通常情况下,服务与服务之间数据的获取并不是一次性的,所以我们把这个RestTemplate注入容器中,这样我们每次使用直接调用即可。@Co......
  • WPF触发器(Triggers):介绍与用法实例
    引言WindowsPresentationFoundation(WPF)提供了一个丰富和灵活的图形渲染框架,触发器(Triggers)是其中一个重要的功能。触发器能够用来控制或改变UI元素的属性、样式、甚至行为。在这篇博客文章中,我们将详细介绍WPF中触发器的种类、用法,并通过一些实际例子进行讲解。1.触发器的种......
  • uniapp打电话实现方法用法介绍
    一、uniapp打电话介绍uniapp是一个跨平台的开发框架,能够快速构建出高效、可靠、易维护的移动应用程序。在移动端开发中,打电话是一项常见的功能,而uniapp也提供了多种实现方法,下面将详细介绍uniapp中打电话的实现方法。二、使用系统API实现打电话在uniapp中,可以使用系统API实现打电话......
  • 深入了解 PostgreSQL:功能、特性和部署
    PostgreSQL,通常简称为Postgres,是一款强大且开源的关系型数据库管理系统(RDBMS),它在数据存储和处理方面提供了广泛的功能和灵活性。本文将详细介绍PostgreSQL的功能、特性以及如何部署和使用它。什么是PostgreSQL?PostgreSQL是一款开源的、免费的关系型数据库管理系统。它具有以下......
  • 在Python中range()的用法:
    在Python中,range()是一个内置函数,用于生成一个整数序列,通常用于循环遍历。以下是range()函数的一些常见用法:1.默认情况当你调用range()函数时,它会生成一个从0开始到给定数字(不包括该数字)的整数序列。foriinrange(5):print(i)#输出:0,1,2,3,42.指定开始和结......
  • 列表的增删改查(range用法:)
    列表的添加.append()lst=[]#向列表末尾添加内容#append()追加lst.append("张绍刚")lst.append("赵本山")lst.append("张无忌")print(lst)#insert()在指定位置插入,原先该位置以后的所有元素都需要往后挪n个位置,因此插入的效率极低。lst.insert(0,"赵敏")#在......
  • PostgreSQL查询约束和创建删除约束
    查询约束SELECTtc.constraint_name,tc.table_name,kcu.column_name,ccu.table_nameASforeign_table_name,ccu.column_nameASforeign_column_name,tc.is_deferrable,tc.initially_deferredFROMinformation_schema.table_constraintsAStc......
  • addEventListener()元素事件监听的用法及事件汇总
     addEventListener() 方法用于给元素添加监听事件,同一个元素可以重复添加,并且不会覆盖之前相同事件,用removeEventListener()方法来移除事件。使用方法:1vararberNameFilter=document.getElementById("arber_name_filter");2arberNameFilter.addEventListener("focus",......
  • 想让你的代码简洁,试试这个SimpleDateFormat类高深用法
    本文分享自华为云社区《从入门到精通:SimpleDateFormat类高深用法,让你的代码更简洁!》,作者:bug菌。环境说明:Windows10+IntelliJIDEA2021.3.2+Jdk1.8@[toc]前言日期时间在开发中是非常常见的需求,尤其是在处理与时间相关的业务逻辑时,我们需要对日期时间进行格式化、比较......
  • golang常见用法
    结构体数组与接口数组转换如果想把[]struct转为[]interface,我们发现直接赋值会报错。理论上interface可以转换任何数据,为什么结构体数组不可以呢?这是因为interface的设计导致的,如果能理解interface的底层实现,就能很清楚知道如何转换了。如图所示,与C++的虚函数类似,interface保......