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 表示如果鍵不存在則不添加
