加入收藏 | 设为首页 | 会员中心 | 我要投稿 焦作站长网 (https://www.0391zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

postgresql实现整改jsonb字段中的某个值

发布时间:2021-10-09 16:23:20 所属栏目:外闻 来源:互联网
导读:这篇文章主要介绍了postgresql 实现修改jsonb字段中的某一个值操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧。 我就废话不多说了,大

这篇文章主要介绍了postgresql 实现修改jsonb字段中的某一个值操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧。

 

我就废话不多说了,大家还是直接看代码吧~

 

1UPDATE tablename SET tags = jsonb_set(tags-'landuse_area', '{landuse_area}',('"' || round((ST_Area(ST_Transform(geom,4527)) * 0.0015) :: NUMERIC,3) || '"')::jsonb, TRUE) WHERE tags @> '{"name":"张三"}';

 

round的目的是保留3位小数

 

st_area是计算多边形的面积,后面的0.0015是面积单位转换为亩

 

st_transform是投影转换,这里我表中原始的geom是4326,不适合计算面积,所以在这里转换为4527计算面积

 

::NUMERIC是转换为numeric数据类型

 

::jsonb是转换为jsonb类型

 

补充:postgresql----JSON和JSONB类型的增删改查

 

postgresql支持两种json数据类型:json和jsonb,而两者唯一的区别在于效率,json是对输入的完整拷贝,使用时再去解析,所以它会保留输入的空格,重复键以及顺序等。而jsonb是解析输入后保存的二进制,它在解析时会删除不必要的空格和重复的键,顺序和输入可能也不相同。使用时不用再次解析。两者对重复键的处理都是保留最后一个键值对。效率的差别:json类型存储快,使用慢,jsonb类型存储稍慢,使用较快。

 

注意:键值对的键必须使用双引号

 

从PostgreSQL 9.3开始,json就成了postgres里的一种数据类型,也就是和varchar、int一样,我们表里的一个字段的类型可以为json了。

 

与此同时,postgres还提供了jsonb格式,jsonb格式是json的二进制形式,二者的区别在于json写入快,读取慢,jsonb写入慢,读取快,但在操作上,二者是没有区别的。下面以jsonb为例。

 

创建表

 

假设我们要存储的json数据是这样的:

 

{

"id": ID

"name":"名字",

"age":年龄

}

 

 

 

建表语句如下:

 

create table if not exists name_age (

info jsonb

)

 

 

 

好了,这样就创建了一张表,里面只有一个 info 字段,下面开始进行CRUD操作。

 

插入数据

 

插入数据可以直接以json格式插入:

 

1insert into name_age values('{"id":1,"name":"小明", "age":18}')

 

在json里插入新的key值gender,如下:

 

1SELECT info||'{"gender":"男"}'::jsonb from name_age where (info->>'id')::int4 = 1

 

查询数据

 

Postgres里的查询需要用到查询符。比如说,我们要查询id为1的数据,语句如下:

 

1select info from name_age where info @> '{"id":1}'::jsonb

 

用到了 @> 这个查询符,表明info当前这条记录里的顶层json中有没有id为1的key-value对;有的话则满足条件。

 

再来一个复杂一点的查询的,查询 age>16 的记录,并且只显示 name ,语句如下:

 

1select info->'name' from name_age where (info->>'age')::int4 > 16

 

关于详细运算符使用,请参考官方文档: 9.15. JSON Functions and Operators

 

修改数据

 

下面,将 age 从 18 改为 22 ,SQL语句:

 

1SELECT info ||'{"age":22}'::jsonb from name_age where (info->>'id')::int4 = 1

 

上述用法仅适用于9.5以上,9.5以下需要整个记录更新,不可以单独修改某个值。

 

除了操作符以外,还可以使用函数操作: jsonb_set() ,函数签名如下:

 

1jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean])

 

详细使用可参考 9.15. JSON Functions and Operators

 

删除数据

 

删除age这个key,SQL如下:

 

1SELECT info-'age' from name_age where (info->>'id')::int4 = 1

 

直接用操作符 - 即可。

 

总结

 

PostgreSQL 9.5以上的版本中有了很多方便的操作符,使得操作json变得非常方便了。

 

json和jsonb的操作符

 

操作符右操作数类型描述示例结果

 

->int获取JSON数组元素(索引从0开始)select '[{"a":"foo"},{"b":"bar"},{"c":"baz"}]'::json->2;{"c":"baz"}

 

->text通过键获取值select '{"a": {"b":"foo"}}'::json->'a';{"b":"foo"}

 

->>int获取JSON数组元素为 textselect '[1,2,3]'::json->>2;3

 

->>text通过键获取值为textselect '{"a":1,"b":2}'::json->>'b';2

 

#>text[]在指定的路径获取JSON对象select '{"a": {"b":{"c": "foo"}}}'::json#>'{a,b}';{"c": "foo"}

 

#>>text[]在指定的路径获取JSON对象为 textselect '{"a":[1,2,3],"b":[4,5,6]}'::json#>>'{a,2}';3

 

jsonb额外操作符

 

操作符右操作数类型描述示例结果

 

@>jsonb左侧json最上层的值是否包含右边json对象select '{"a":{"b":2}}'::jsonb @> '{"b":2}'::jsonb;

 

select '{"a":1, "b":2}'::jsonb @> '{"b":2}'::jsonb;f

 

t

 

<@jsonb左侧json对象是否包含于右侧json最上层的值内select '{"b":2}'::jsonb <@ '{"a":1, "b":2}'::jsonb;t

 

?texttext是否作为左侧Json对象最上层的键select '{"a":1, "b":2}'::jsonb ? 'b';t

 

?|text[]text[]中的任一元素是否作为左侧Json对象最上层的键select '{"a":1, "b":2, "c":3}'::jsonb ?| array['b', 'c'];t

 

?&text[]text[]中的所有元素是否作为左侧Json对象最上层的键select '["a", "b"]'::jsonb ?& array['a', 'b'];t

 

(编辑:焦作站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读