USEGEAR

导航

PG的json类型

1、json分成json(纯字符串)和jsonb(二进制)

2、查询json

CREATE TABLE "test"."test_json1" (
  "id" serial2,
  "name" json,
  PRIMARY KEY ("id")
);
INSERT INTO "test_json1" ("name")  VALUES('{"col1":2,"col2":"fp","col3":"male"}') ;
INSERT INTO "test_json1" ("name")  VALUES('{"col1":1,"col2":"francs","col3":"female"}')

通过“->”操作符可以查询json 数据的键值:

SELECT name->'col2' FROM test_json1 WHERE id=1
结果:
?column?
” fra ncs ”

返回文本格式:

SELECT name ->> ’col2FROM test_sonl WHERE id=l ;
结果: ?
column? francs

3、json和jsonb的差异

PostgreSQL 支持两种JSON 数据类型: json 和jsonb ,两种类型在使用上几乎完全相同,两者主要区别为以下: json 存储格式为文本而jsonb 存储格式为二进制,由于存储格式的不同使得两种json 数据类型的处理效率不一样, json 类型以文本存储并且存储的内容和输人
数据一样,当检索json 数据时必须重新解析,而jsonb 以二进制形式存储已解析好的数据,当检索jsonb 数据时不需要重新解析,因此json 写人比jsonb 快,但检索比jsonb 慢。

(1)jsonb 输出的键的顺序和输入不一样,而json 的输出键的顺序和输入完全一样。

(2)jsonb 类型会去掉输入数据中键值的空格,而json是保持原样

因此 在大多数应用场景下建议使用jsonb ,除非有特殊的需求,比如对json 的键顺序有特殊的要求

 

4、json和jsonb操作符

(1)返回文本格式应【->>】

  (2) 字符串是否作为顶层键值 【?】

SELECT  ' { "a":1 , "b":2}':: jsonb ? 'a'
?column?
t

(3)删除json 数据的键/值 【-】

SELECT  ' { "a":1 , "b":2}':: jsonb - 'a'

?column 。
{ ” b ” : 2}

 

5、 jsonb 与json 函数,最常用的

(1)扩展最外层的json 对象成为一组键/值结果集【json_each】

SELECT * FROM json_each('{"a":"foo","b":"bar"}');

key I value
--------+-------
a I ” fo 。”
b I ” bar”

(2)返回文本形式【json each text】

SELECT * FROM json_each_text('{"a":"foo","b":"bar"}');

key I value
--------+-------
a I foo
b I bar

(3)【row_to j son()函数】【json object keys】

SELECT row_to_json(test_json1) from test_json1 WHERE id=1

SELECT * FROM json_object_keys('{"a":"foo","b":"bar"}');

 

6、jsonb 键/值的追加、删除、更新

(1)jsonb 键/值追加可通过“||”操作符

SELECT '{"name":"francs","age":"31"}' :: jsonb || '{"sex":"male"}'::jsonb;

{"age": "31", "sex": "male", "name": "francs"}

(2)jsonb 键/值的删除有两种方法,一种是通过操作符【-】删除,另一种通过【#-】删除指定键/值

SELECT '{"name":"francs","age":"31"}' :: jsonb - 'age'

{"name": "francs"}

操作符【#-】删除指定键/值,通常用于有嵌套json 数据删除的场景,如下代码删除嵌套contact 中的fax 键/值:

SELECT '{"name":"francs","age":"31","contact":{"phone":"1390101110","fax":"010-88657890"}}' :: jsonb #-  '{contact,fax}' ::text[];

{"age": "31", "name": "francs", "contact": {"phone": "1390101110"}}

也可以指定位置如1的键值:
SELECT '{"name":"francs","age":"31","contact":{"phone":"1390101110","fax":"010-88657890"}}' :: jsonb #-  '{contact,1}' ::text[]

 (2)jsonb更新

【||】和函数【jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean])】

函数jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean])的说明:

target 指源jsonb 数据, path 指路径, new_value 指更新后的键值, creat_missing 值为true 表示如果键不存在则添加, create_missing 值为false 表示如果键不存在则不添加

posted on 2021-12-08 12:38  USEGEAR  阅读(2127)  评论(0编辑  收藏  举报