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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM