PostgreSql中的JSON數據類型

PostgreSQL 提供了兩種 JSON 數據類型:JSON 以及 JSONB。這兩種類型主要的區別在于數據存儲格式,JSONB 使用二進制格式存儲數據,更易于處理。

PostgreSQL 推薦優先選擇 JSONB 數據類型。

兩種數據類型之間的區別:

功能JSONJSONB
存儲格式字符串原文存儲解析后的二進制
全文索引不支持支持
保留空白符保留不保留
保留鍵的順序保留不保留
保留重復鍵保留不保留

由于存儲格式的不同,JSONB 輸入時稍微慢一些(需要轉換),但是查詢時快很多。

接下來的內容主要使用 JSONB 數據類型,但是大部分功能也可以使用 JSON 數據類型。

一、創建并插入數據

CREATE TABLE product (id INTEGER NOT NULL PRIMARY KEY,name VARCHAR(100),attr1 JSONB,attr2 JSON
);

1. 插入數據:

INSERT INTO product
VALUES( 1, '阿莫西林', '{"code": "100011","price": 18,"uom": "盒","specification": "10粒/盒","price": 18.00}','{"code": "100011","price": 18,"uom": "盒","specification": "10粒/盒","price": 18.00}');INSERT INTO product
VALUES( 2, '阿司匹林', '{"code": "100013","price": 28,"uom": "盒","specification": "20粒/盒","price": 28.00}','{"code": "100013","price": 28,"uom": "盒","specification": "20粒/盒","price": 28.00}');

?2. 查詢數據:

從紅框中內容可以看出來兩種類型的區別:JSON保留原格式,JSONB不做保留,具體見上邊的表格。

3. 格式化方法插入:

jsonb_build_object、json_build_object?函數可以通過一系列輸入創建JSON 對象

	
INSERT INTO product
VALUES( 3, '農夫山泉', jsonb_build_object ( 'code', '100015', 'price', 3 ), json_build_object ( 'code', '100015', 'price', 3 ) );

其他常用的構建 JSON 數據的函數如下:

  • to_json 以及 to_jsonb

  • array_to_json

  • row_to_json

  • json_build_array 以及 jsonb_build_array

  • json_object 以及 jsonb_object

具體操作可以參考:PostgreSQL操作json/jsonb方法詳解_PostgreSQL_腳本之家

這些方法看完還是覺得直接輸入來的簡單方便,也可能我沒有領略到精髓。

二、查詢JSON字段及屬性(下邊都以JSONB的格式)

?1. 查詢JSON字段:

product=# select * from product where id =3 ;id |   name   |             attr1              |              attr2
----+----------+--------------------------------+----------------------------------3 | 農夫山泉 | {"code": "100015", "price": 3} | {"code" : "100015", "price" : 3}
(1 row)product=# select name, attr1, attr2 from product where id =3 ;name   |             attr1              |              attr2
----------+--------------------------------+----------------------------------農夫山泉 | {"code": "100015", "price": 3} | {"code" : "100015", "price" : 3}
(1 row)

2.?獲取JSON單個屬性

查詢attr1下的code屬性,

運算符 -> 可以通過指定節點的鍵獲取相應的數據。這種方法返回的數據仍然是 JSON 類型,使用雙引號包含。

如果想要以字符串形式返回節點中的數據值,可以使用運算符 ->>。如:

如果查詢的 JSON 節點不存在,將會返回空值:

3. 獲取JSON數組屬性

第二個 -> 運算符返回了該屬性中的第 1 個數組元素(數組下標從 0 開始)。

注意這里第一個不能使用“ ->>”,轉成字符串之后就沒法再往下獲取元素了。

運算符 #> 以及 #>> 可以通過指定 JSON 節點的路徑獲取嵌套屬性,路徑可以包含鍵的名稱或者數組元素下標,返回類型分別為 JSON 和字符串。

4. 基于JSON數據的過濾

直接以屬性作為條件進行查詢:這種無法根據屬性進行匹配,

?如果要匹配就需要用以下方式:

需要注意的是->是json格式,-->是字符,需要注意匹配,如元素屬性為數字,則需要轉換后對比:

5. JSON 轉換為數據行

PostgreSQL 支持將 JSON 字段轉換為數據行格式。例如,jsonb_each 函數可以將每個鍵值對轉換為一個記錄:

與此類似的函數還有:

  • json_each 以及 json_each_text

  • json_array_elements 以及 json_array_elements_text

  • jsonb_array_elements 以及 jsonb_array_elements_text

6. 獲取所有JSON的key

7. 判斷JSON屬性是否存在

PostgreSQL 還提供了一些用于判斷 JSON 屬性是否存在的運算符,例如 ? 運算符。

三、更新 JSON 字段數據

1. || 運算符

使用 UPDATE 語句更新 JSON 字段時,可以通過 || 運算符將新的鍵值增加到已有 JSON 數據。例如:

JSONB格式沒有順序

2.?jsonb_insert 方法

利用 jsonb_insert 方法,例如:

3. jsonb_set 方法

如果想要更新已有鍵的數值,可以使用 jsonb_set 函數。例如:

如果沒有key則新增:

?

四、刪除 JSON 字段數據

1. 刪除整個 JSON 字段數據可以簡單地將其設置為 NULL,例如:

2.?刪除 JSON 字段中的某個屬性可以使用 - 運算符,例如:

當沒有元素屬性時,不會刪除報錯。

五、全文索引

PostgreSQL 提供了支持 JSON 字段的全文索引,可以優化查詢的性能。這種索引的類型為 GIN(通用倒排索引),通常用于搜索引擎。

 CREATE INDEX index_product_att1 ON product USING GIN(attr1);

attr1時JSONB類型,而atttr2是JSON類型,創建索引會報錯,這個差異對應了上邊表格

以上基本是暫時了解到的內容,歡迎交流斧正!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/44949.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/44949.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/44949.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網絡建設與運維23國賽網絡運維正式賽題解析

競賽環境請看主頁! 23國賽網絡運維 任務描述:某集團公司在更新設備后,路由之間無法正常通信,請修 復網絡達到正常通信。 (1) 請在server1“管理員”下拉菜單中選擇“鏡像”選項卡,點 擊 “創…

超聲波眼鏡清洗機有用嗎?四大主流超聲波清洗機品牌整理測評

長期佩戴的眼鏡,若不定期清洗,不僅鏡片會逐漸積聚油脂、灰塵,影響透光率,使視物模糊,更嚴重的是,眼鏡上日益增加的微小雜質和細菌可能會逐漸影響到眼睛健康,導致視力下降、眼部疾病等問題。 這…

Go 1.19.4 函數-Day 08

1. 函數概念和調用原理 1.1 基本介紹 函數是基本的代碼塊,用于執行一個任務。 Go 語言最少有個 main() 函數。 你可以通過函數來劃分不同功能,邏輯上每個函數執行的是指定的任務。 函數聲明告訴了編譯器函數的名稱,返回類型,和參…

STM32 - PWR 筆記

PWR(Power Control)電源控制 PWR 負責管理 STM32 內部的電源供電部分,可以實現 可編程電壓監測器 和 低功耗模式 的功能 可編程電壓監測器(PVD)可以監控VDD電源電壓,當VDD下降到PVD閥值以下或上升到PVD…

usbserver工程師手記(三)手工開通 OTP功能

1、設定密鑰,用戶自行選擇一個密鑰,以下以密鑰為 EAZAYOKNGETBOPC5 為例說明 2、usb server 配置otp 密鑰,目前還沒有UI 界面開通,后續版本會支持從管理界面開通 curl -X POST -H Content-Type: application/json -H Accept: app…

關于transformers庫驗證時不進入compute_metrics方法的一些坑

生成式任務輸入就是標簽 transformers在進入compute_metrics前會有一個判斷,源碼如下: # 版本 transformers4.41.2 # 在trainer.py 的 3842 行 # Metrics! if (self.compute_metrics is not Noneand all_preds is not Noneand all_labels is not Nonea…

Centos7下zabbix安裝與部署

Centos7下zabbix安裝與部署 一、Zabbix介紹 1、zabbix是一個基于WEB界面的提供分布式系統監視以及網絡監視功能的企業級的開源解決方案 2、zabbix能監視各種網絡參數,保證服務器系統的安全運營;并提供靈活的通知機制以讓系統管理員快速定位/解決存在的各…

活動策劃秘籍:如何讓企業活動引爆市場?

作為一個活動策劃,我的經驗是,活動策劃是一場精心編排的交響樂,每一個音符都要恰到好處。 想要做好企業活動策劃工作的關鍵在于綜合考慮多個方面,并確保每個環節的順暢執行。 以下是7個關鍵要素,只要用心體會&#x…

學習小記-使用Redis的令牌桶算法實現分布式限流

在介紹令牌桶算法前先介紹一下漏桶算法(Leaky Bucket) 漏桶算法(Leaky Bucket) 漏桶算法是一種固定容量的容器模型,它通過控制數據流入和流出的速度來限制數據的傳輸速率。漏桶算法的主要特點包括: 固定…

鴻蒙開發:Universal Keystore Kit(密鑰管理服務)【密鑰派生(C/C++)】

密鑰派生(C/C) 以HKDF256密鑰為例,完成密鑰派生。具體的場景介紹及支持的算法規格,請參考[密鑰生成支持的算法]。 在CMake腳本中鏈接相關動態庫 target_link_libraries(entry PUBLIC libhuks_ndk.z.so)開發步驟 生成密鑰 指定密鑰別名。 初始化密鑰屬…

通過電壓差判定無源晶振是否起振正確嗎?

在電子工程中,無源晶振作為許多數字電路的基礎組件,其是否成功起振對于系統的正常運行至關重要。然而,通過簡單檢測晶振兩端的電壓差來判斷晶振是否工作,這一方法存在一定的誤區,晶發電子將深入探討這一話題&#xff0…

2008年下半年軟件設計師【下午題】真題及答案

文章目錄 2008年下半年軟件設計師下午題--真題2008年下半年軟件設計師下午題--答案 2008年下半年軟件設計師下午題–真題 2008年下半年軟件設計師下午題–答案

四川赤橙宏海商務信息咨詢有限公司抖音電商服務靠譜嗎?

在數字化浪潮席卷全球的今天,電商行業蓬勃發展,各種新興電商平臺層出不窮。其中,抖音電商以其獨特的社交屬性和龐大的用戶基礎,迅速崛起為行業新星。四川赤橙宏海商務信息咨詢有限公司,作為專注于抖音電商服務的佼佼者…

個人怎么交易現貨黃金:加速形態

我們作為普通個人,在現貨黃金市場中交易就需要掌握相應的現貨黃金投資技巧。下面我們就來介紹一個,個人怎么交易現貨黃金的形態——加速形態。 加速形態是用于判斷市場趨勢力竭的情況,這種趨勢可以是上升,也可以是下跌。但是要注意…

用Qwt進行圖表和數據可視化開發

目錄 Qwt介紹 示例應用場景 典型QWT開發流程 舉一些Qwt的例子,多繪制幾種類型的圖像 1. 繪制折線圖 (Line Plot) 2. 繪制散點圖 (Scatter Plot) 3. 繪制柱狀圖 (Bar Plot) 4. 繪制直方圖 (Histogram) Qwt介紹 QWT開發主要涉及使用QWT庫進行圖表和數據可視化…

晉升業內新寵兒,MoE模型給了AI行業兩條關鍵出路

文 | 智能相對論 作者 | 陳泊丞 今年以來,MoE模型成了AI行業的新寵兒。 一方面,越來越多的廠商在自家的閉源模型上采用了MoE架構。在海外,OpenAI的GPT-4、谷歌的Gemini、Mistral AI的Mistral、xAI的Grok-1等主流大模型都采用了MoE架構。 …

第三方配件也能適配蘋果了,iOS 18與iPadOS 18將支持快速配對

蘋果公司以其對用戶體驗的不懈追求和對創新技術的不斷探索而聞名。隨著iOS 18和iPadOS 18的發布,蘋果再次證明了其在移動操作系統領域的領先地位。 最新系統版本中的一項引人注目的功能,便是對藍牙和Wi-Fi配件的配對方式進行了重大改進,不僅…

python如何計算兩個時間相差多少秒鐘,分鐘,小時,天,月,年

使用場景:在做上課記錄系統的時候,有上課開始時間和上課結束時間,需要計算這兩個時間的插值,以分鐘為單位。 封裝方法如下: from datetime import datetimedef sub_seconds(date1: str "2024-07-11 12:33:33&q…

【CORS 報錯】跨域請求問題:CORS 多種環境下的解決方案

🔥 個人主頁:空白詩 文章目錄 一、CORS錯誤的常見原因二、解決方案1. Vue3 Vite項目下的解決方案創建Vue3 Vite項目配置Vite的代理發送請求 2. jQuery項目下的解決方案使用CORS請求頭使用JSONP 3. 其他環境下的解決方案使用服務器端代理設置CORS頭使用…

PS拉框選擇工具

Photoshop(PS)中的拉框選擇工具,也稱為選框工具,是圖像處理中非常基礎且強大的工具之一。它允許用戶通過繪制矩形、橢圓形以及單行、單列的選擇框來選定圖像中的特定區域。本教程將詳細介紹選框工具的使用方法、技巧及其屬性設置。…