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 ->> ’col2 ’ FROM 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 表示如果键不存在则不添加