postgres JSON

json和jsonb的比较:

注:因为读的多,所有没有特殊要求,推荐都用jsonb

1,json存储格式为文本而jsonb存储格式为二进制 ,因此json写入比jsonb快,但查询比jsonb慢。

2,jsonb输出的键的顺序和输入不一样,而json的输出是完全一样的

3,jsonb类型会去掉输入数据中键值的空格,而json不会

4,jsonb会删除重复的键,仅保留最后一个,而json不会

操作符

json&jsonb
操作符类型描述实例 结果
-> int

数组元素(索引从 0 开始)

SELECT '[1,2,3]'::jsonb -> 12
->text键(key)SELECT '{"name":"xiaomin"}'::jsonb ->'name' "xiaomin"
->>int和->差不多,区别在以文本形式SELECT '[1,2,3]'::jsonb -> 12
->>text->区别在以文本形式SELECT '{"name":"xiaomin"}'::jsonb ->'name'"xiaomin"
#>text[]解析逗号隔开SELECT '{"info":{"name":"xioami"}}'::jsonb #>> '{info,name}'"xiaomin"
#>>text[]和#>区别在于文本形式SELECT '{"info":{"name":"xioami"}}'::jsonb #>> '{info,name}'"xiaomin"

 

 

 

 

 

 

 

 

 

jsonb
操作符类型描述实例 结果
||jsonb拼接(追加){"name": "xiaomin", "label": "hello"}{"name": "xiaomin", "label": "hello"}
-text删除SELECT '{"name":"xiaomin"}'::jsonb - 'name'{}
......https://edu.csdn.net/skill/pg/pg-69ad784e39c044d7a115cfd124e49ef1?category=607

 

 

 

 

 

 

 

函数

jsonb_object_keys(扁平化对象,对数组无用)

SELECT jsonb_object_keys('{"name":"xiao","age":18}'::jsonb)

 

json_extract_path和#>一样,不做多说

json_array_length(查询长度)

 SELECT json_array_length('[1,2,3,4]')

 json_array_elements(扁平化数组,对象无用)

SELECT json_array_elements('[{"name":"xiao"},{"name":"hone"},{"name":"mi"}]') #> '{name}' as test

 

也可以多个拼接 

SELECT json_array_elements('[{"name":"xiao","age":18},{"name":"hone","age":14},{"name":"mi","age":10}]') #> '{name}' as name,json_array_elements('[{"name":"xiao","age":18},{"name":"hone","age":14},{"name":"mi","age":10}]') #> '{age}' as age

 

 

实例 

建表test

注:关键看info其它的无关

插入一条数据

 

info:内容是

{
  "project": false,
  "project_edit": true,
  "project_query": false,
  "pm_query_statistics": true
}

基本查询

SELECT jsonb_object_keys(t.info::jsonb) as permission,id as permission_id from test as t

 

 

对应值查询,把key,value拿出来

-- 对应关系查询
select json_extract_path(t."info"::json,  jsonb_object_keys(t.info::jsonb)) as off,jsonb_object_keys(t.info::jsonb) as permission,id as permission_id from test t

添加

update test set info = info::jsonb || '{"query": true}'::jsonb where id = 1;

 

删除 

update test set info = info::jsonb::jsonb - 'pm_query_statistics' where id = 1;

删除多个,

update test set info = info::jsonb::jsonb - '键key' - '键key2' where id = 1;

 

更改 

UPDATE test set info = jsonb_set(info, '{query}'::_text, 'false'::jsonb, true)  where id = 1

新建视图,放到视图中

 注:视图中off字段json转bool会失败,强制转换即可,::text::bool

 SELECT (json_extract_path((t.info)::json, VARIADIC ARRAY[jsonb_object_keys(t.info)]))::text::bool AS off,
 jsonb_object_keys(t.info::jsonb)::VARCHAR as permission,
 id
   FROM test t

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值