博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PostgreSQL操作JSON数据
阅读量:6588 次
发布时间:2019-06-24

本文共 2226 字,大约阅读时间需要 7 分钟。

文章出处:http://it.taocms.org/07/4097.htm

PostgreSQL官方关于JSON的文档:http://www.postgresql.org/docs/9.3/static/functions-json.html

摘要: 从PostgreSQL 9.3版本开始,JSON已经成为内置数据类型,“一等公民”啦。还在羡慕什么文档或者BSON么,赶紧玩玩吧。另外9.4版本,提供JSONB(Binary),提供更多JSON函数和索引支持。刚好手头有一个需求,是涉及到数组类型的,...

 

从PostgreSQL 9.3版本开始,JSON已经成为内置数据类型,“一等公民”啦。

还在羡慕什么文档数据库或者BSON么,赶紧玩玩吧。另外9.4版本,提供JSONB(Binary),提供更多JSON函数和索引支持。

刚好手头有一个需求,是涉及到数组类型的,懒的插入多条数据库记录,想起了ARRAY数据类型。

常用的读取操作符目前大概有三类:->->>#>。还是直接看SQL查询的例子吧。

先看->类:

postgres=# select '[1,2,3]'::json->2; ?column? ---------- 3 (1 row) postgres=# select '{"a":1,"b":2}'::json->'b'; ?column? ---------- 2 (1 row)

再来->>例子:

postgres=# select '[1,2,3]'::json->>2; ?column? ---------- 3 (1 row) postgres=# select '{"a":1,"b":2}'::json->>'b'; ?column? ---------- 2 (1 row)

有没有发现其实->->>出来的结果肉眼看起来是一样的?区别在于后者是返回text。

上面两个操作符实现了读取,其实大部分时候我们的JSON不是这么简单,会内嵌各种数组和哈希,这么读下去会死人的吧。当然,有一种类似path的读取,看例子吧:

postgres=# select '{"a":[1,2,3],"b":[4,5,6]}'::json#>'{a,2}'; ?column? ---------- 3 (1 row) postgres=# select '{"a":[1,2,3],"b":[4,5,6]}'::json#>>'{a,2}'; ?column? ---------- 3 (1 row)

当然里面可以嵌套很多,比如{a,2,b,3}等等。下面再来点表的例子:

postgres=# create table testjson(id serial, data json); postgres=# insert into testjson (data) values('{"a": 1, "b": 2}'::json); postgres=# insert into testjson (data) values('{"a": 3, "b": 4, "c": 5}'::json); postgres=# insert into testjson (data) values('{"a": 6, "c": 7}'::json);

插入数据是不是很熟悉,基本和普通使用JSON一致,初窥下select结果:

postgres=# select * from testjson; id | data ----+-------------------------- 1 | { "a": 1, "b": 2} 2 | { "a": 3, "b": 4, "c": 5} 3 | { "a": 6, "c": 7} (3 rows)

很眼熟,where条件可以这么用:

postgres=# select * from testjson where (data->>'a')::int>1; id | data ----+-------------------------- 2 | { "a": 3, "b": 4, "c": 5} 3 | { "a": 6, "c": 7} (2 rows)

注意这里是->>转换成text然后在::int进行比较。

不过这里有个坑,不知道怎么解决,比如:

postgres=# insert into testjson (data) values('{"a": "smallfish"}'); postgres=# select * from testjson; id | data ----+-------------------------- 1 | { "a": 1, "b": 2} 2 | { "a": 3, "b": 4, "c": 5} 3 | { "a": 6, "c": 7} 5 | { "a": "smallfish"} (4 rows)

这个时候上面的::int>1这样就报错了,因为最后一行a为字符串。

mongodb这个问题解决的挺好,回头搜搜在Pg里怎么搞。

话说,Pg里支持的JSON是不是和之前提到的类型有的一相似的地方?

两者优劣回头我再贴文吧。

转载于:https://www.cnblogs.com/zcm123/p/7145681.html

你可能感兴趣的文章
protobuf
查看>>
循环次数( M - 暴力求解、打表)
查看>>
网络对抗技术_作业一_201421420013
查看>>
js实现复制文字到剪切板
查看>>
listen 57
查看>>
HBase基础讲解
查看>>
Codeforces Round #334 (Div. 2)
查看>>
java写入换行符
查看>>
分区表详解
查看>>
一、CSS的基础样式
查看>>
JS日期相关代码
查看>>
【转】numpy中 meshgrid 和 mgrid 的区别和使用
查看>>
Adapter
查看>>
爬虫开发过程 - 采集器设计
查看>>
软件工程个人总结
查看>>
深入理解JavaScript的原型和闭包(一)
查看>>
Wordpress搭建
查看>>
获取百度地图代码方法
查看>>
MongoDB权威指南学习笔记
查看>>
让作为背景图片的图片显示,上面的文字消失
查看>>