Postgres 字段 Json 类型查询

Postgres 支持两种 json 数据类型:json 和 jsonb

json 是对输入的完整拷贝,使用时再去解析,所以它会保留输入的空格,重复键以及顺序等
jsonb 是解析输入后保存的二进制,它在解析时会删除不必要的空格和重复的键,顺序和输入可能也不相同,使用时不用再次解析
效率的差别:json类型存储快,使用慢 ;jsonb类型存储稍慢,使用较快

info:
{
	"name":"名字",
	"age":"年龄"
}

id: ["123","456"]

一、连接配置

&stringtype=unspecified 用于把 JSON 类型当 String 类型存储

spring:
  datasource:
    driver-class-name: org.postgresql.Driver
    url: jdbc:postgresql://127.0.0.1:5432/demo?useUnicode=true&characterEncoding=UTF-8&stringtype=unspecified
    username: postgres
    password: postgres

二、查询语句

查询 name = bai 的这条记录

select * from user where info ->> 'name' = 'bai';

查询数组中第二个元素

select info ->> 1 from user;

查询 age > 16 的记录,并且只显示 name

select info -> 'name' from user where (info ->> 'age')::int4 > 16;

查询 info 这条记录里的顶层 json 中有没有 age = 12 的 key-value 对,有返回 t , 否则返回 f

select info from user where info @> '{"age":12}'::jsonb;

查询 id = 123 这条记录是否存在 json 数组中,返回数量

select count(1) from user, json_array_elements_text(id::json) ids where ids = '123';

查询数组的长度

select jsonb_array_length(info::jsonb) from user;

查询所有的 name

-- "张三"
select json_array_elements(info::json) -> 'name' as name from user;

-- 张三
select json_array_elements(info::json) ->> 'name' as name from user;

-- "张三"
select json_array_elements(info::json) #> '{name}' as name from user;

select distinct names from (select json_array_elements(info::json) #> '{name}' as names from user) u;

三、操作符

操作符右操作数类型描述示例结果
->int获取 JSON 数组元素(索引从0开始)select ‘[{“a”:“foo”},{“b”:“bar”},{“c”:“baz”}]’::json -> 2{“c”:“baz”}
->texttext 通过键获取值select ‘{“a”: {“b”:“foo”}}’::json -> ‘a’{“b”:“foo”}
->>int获取 JSON 数组元素为 textselect ‘[1,2,3]’::json ->> 23
->>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
||jsonbjsonb 连接两个 JSON 对象,组成一个新的 JSON 对象select ‘[“a”, “b”]’::jsonb || ‘[“c”, “d”]’::jsonb[“a”,“b”,“c”,“d”]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值