pgsql jsonb常用sql

别说谁变了你拦得住时间么 提交于 2019-12-25 16:57:31

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

json,jsonb区别

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

json和jsonb共同操作符

操作符 返回类型 数组[1,2,3] {"a":1,"b":2,"c":3} {"a":{"b":{"c":1}},"d":[4,5,6]}
-> json select '[1,2,3]'::jsonb ->2 = 3 select '{"a":1,"b":2,"c":3}'::jsonb-> 'a'=1 select '{"a":{"b":{"c":1}},"d":[4,5,6]}'::jsonb ->'a'={"b": {"c": 1}}
->> text select '[1,2,3]'::jsonb ->>2 = 3 select '{"a":1,"b":2,"c":3}'::jsonb->> 'a'=1 select '{"a":{"b":{"c":1}},"d":[4,5,6]}'::jsonb ->>'a'={"b": {"c": 1}}
#> json -- -- select '{"a":{"b":{"c":1}},"d":[4,5,6]}'::jsonb #> '{a,b}' ={"c": 1}
#>> text -- -- select '{"a":{"b":{"c":1}},"d":[4,5,6]}'::jsonb #> '{a,b}' ={"c": 1}

jsonb额外操作符

操作符 右操作数类型 描述 例子
@> jsonb 左边的 JSON 值是否包含顶层右边JSON路径/值项? '{"a":1, "b":2}'::jsonb @> '{"b":2}'::jsonb
<@ jsonb 左边的JSON路径/值是否包含在顶层右边JSON值中? '{"b":2}'::jsonb <@ '{"a":1, "b":2}'::jsonb
? text 字符串是否作为顶层键值存在于JSON值中? '{"a":1, "b":2}'::jsonb ? 'b'
?| text[] 这些数组字符串中的任何一个是否作为顶层键值存在? '{"a":1, "b":2, "c":3}'::jsonb ?|array['b',c']
?& text[] 这些数组字符串是否作为顶层键值存在? '["a", "b"]'::jsonb ?& array['a', 'b']
|| jsonb 连接两个jsonb值到新的jsonb值 '["a", "b"]'::jsonb|| '["c", "d"]'::jsonb
- text 从左操作数中删除键/值对或字符串元素。基于键值匹配键/值对。 '{"a": "b"}'::jsonb - 'a'
- integer 删除指定索引的数组元素(负整数结尾)。如果顶层容器不是一个数组,那么抛出错误。 '["a", "b"]'::jsonb - 1
#- text[] 删除指定路径的域或元素(JSON数组,负整数结尾) '["a", {"b":1}]'::jsonb #- '{1,b}'

以上,转载自:https://www.cnblogs.com/zhangfx01/p/9506219.html

 

 

创建表

CREATE TABLE "test_jsonb" (
"col" jsonb
)
WITH (OIDS=FALSE)
;

插入数据

INSERT INTO "public"."test_jsonb" ("col") VALUES ('{"age": "13", "name": "张三", "address": {"city": "北京市朝阳区", "detail": "宝能中心a座"}}');
INSERT INTO "public"."test_jsonb" ("col") VALUES ('{"age": "14", "name": "李四", "address": {"city": "北京市朝阳区", "detail": "宝能中心b座"}}');
INSERT INTO "public"."test_jsonb" ("col") VALUES ('{"age": "15", "name": "王五", "address": {"city": "北京市朝阳区", "detail": "宝能中心c座"}}');

 

查询单独字段

select col->>'name' from test_jsonb;

条件查询

select * from test_jsonb 
where col->>'name' = '张三';

排序

SELECT * FROM test_jsonb
order by col->>'age' desc;

分页

  • 取前两条数据
select * from test_jsonb 
limit 2;
  • 每页2条,取第2页

select * from test_jsonb 
offset 2 limit 2;

offset = (pageNo-1)*pageSize

limit = pageSize

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!