postgreSQL 玩轉josnb (長期更新)

来源:https://www.cnblogs.com/tplife2019/archive/2019/02/21/10413074.html
-Advertisement-
Play Games

恢復內容開始 json和jsonb的操作符 獲取JSON數組元素為 text 在指定的路徑獲取JSON對象 在指定的路徑獲取JSON對象為 text jsonb額外操作符 select '{"a":{"b":2}}'::jsonb @> '{"b":2}'::jsonb; select '{"a": ...


json和jsonb的操作符

 

jsonb額外操作符

 

 

 

json創建函數

 

 

json處理函數 

函數 返回類型 描述 示例 結果

json_array_length(json)

jsonb_array_length(jsonb)

int  返回Json數組最外層元素個數  select json_array_length('[1,2,3,{"f1":1,"f2":[5,6]},4]');  5

json_each(json)

jsonb_each(jsonb)

setof key text, value json

setof key text, value jsonb

 將最外層Json對象轉換為鍵值對集合  select json_each('{"a":"foo", "b":"bar"}');  

(a,"""foo""")
(b,"""bar""")

json_each_text(json)

jsonb_each_text(jsonb)

setof key text, value text  將最外層Json對象轉換為鍵值對集合,且value為text類型  select json_each_text('{"a":"foo", "b":"bar"}');  

(a,foo)
(b,bar)

json_extract_path(from_json json,

VARIADIC path_elems text[])

 

jsonb_extract_path(from_json jsonb,

VARIADIC path_elems text[])

json

jsonb

 返回path_elems指向的value,同操作符#>  select json_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}','f4');  {"f5":99,"f6":"foo"}

json_extract_path_text(from_json json,

VARIADIC path_elems text[])

 

jsonb_extract_path_text(from_json jsonb,

VARIADIC path_elems text[])

text   返回path_elems指向的value,並轉為text類型,同操作符#>>  select json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}','f4', 'f6');  foo

json_object_keys(json)

jsonb_object_keys(jsonb)

setof text  返回json對象最外層的key  select json_object_keys('{"f1":"abc","f2":{"f3":"a", "f4":"b"}}');  

f1
f2

json_populate_record(base anyelement,

from_json json)

 

jsonb_populate_record(base anyelement,

from_json jsonb)

anyelement  將json對象的value以base定義的行類型返回,如果行類型欄位比json對象鍵值少,則多出的鍵值將被拋棄;如果行類型欄位多,則多出的欄位自動填充NULL。

 表tbl_test定義:

 

Table "public.tbl_test"
Column | Type | Modifiers 
--------+-----------------------+-----------
a | bigint | 
b | character varying(32) |

c | character varying(32) |

 

select * from json_populate_record(null::tbl_test, '{"a":1,"b":2}');

 

 

a |  b |  c 
---+---+------
1 | 2  | NULL

json_populate_recordset(base anyelement,

from_json json)

 

jsonb_populate_recordset(base anyelement,

from_json jsonb)

setof anyelement  將json對象最外層數組以base定義的行類型返回

表定義同上

 select * from json_populate_recordset(null::tbl_test, '[{"a":1,"b":2},{"a":3,"b":4}]');

 

a | b |  c 
---+---+------
1 | 2 | NULL
3 | 4 | NULL

json_array_elements(json)

jsonb_array_elements(jsonb)

setof json

setof jsonb

 將json數組轉換成json對象value的集合  select json_array_elements('[1,true, [2,false]]');  

1
true
[2,false]

json_array_elements_text(json)

jsonb_array_elements_text(jsonb)

setof text  將json數組轉換成text的value集合  select json_array_elements_text('["foo", "bar"]');  

foo
bar

json_typeof(json)

jsonb_typeof(jsonb)

text

 返回json最外層value的數據類型,可能的類型有

 objectarraystringnumberboolean, 和null.

 select json_typeof('-123.4')  number

json_to_record(json)

jsonb_to_record(jsonb)

record  根據json對象創建一個record類型記錄,所有的函數都返回record類型,所以必須使用as明確定義record的結構。  select * from json_to_record('{"a":1,"b":[1,2,3],"c":"bar"}') as x(a int, b text, d text);  

a |    b    |   d 
---+---------+------
1 | [1,2,3] | NULL

json_to_recordset(json)

jsonb_to_recordset(jsonb)

setof record  根據json數組創建一個record類型記錄,所有的函數都返回record類型,所以必須使用as明確定義record的結構。  select * from json_to_recordset('[{"a":1,"b":"foo"},{"a":"2","c":"bar"}]') as x(a int, b text);  

a | b 
---+------
1 | foo
2 | NULL

json_strip_nulls(from_json json)

jsonb_strip_nulls(from_json jsonb)

json

jsonb

 返回json對象中所有非null的數據,其他的null保留。  

select json_strip_nulls('[{"f1":1,"f2":null},2,null,3]');

  [{"f1":1},2,null,3]

 jsonb_set(target jsonb, path text[],new_value jsonb[,create_missing boolean])

 jsonb  如果create_missing為true,則將在target的path處追加新的jsonb;如果為false,則替換path處的value。

 select jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{0,f1}','[2,3,4]', false);

 

select jsonb_set('[{"f1":1,"f2":null},2]', '{0,f3}','[2,3,4]');

 [{"f1": [2, 3, 4], "f2": null}, 2, null, 3]

 

[{"f1": 1, "f2": null, "f3": [2, 3, 4]}, 2]

 jsonb_insert(target jsonb, path text[],

new_value jsonb, [insert_after boolean])

 jsonb 如果insert_after是true,則在target的path後面插入新的value,否則在path之前插入。

 select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"');

 

select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"', true);

 {"a": [0, "new_value", 1, 2]}

 

{"a": [0, 1, "new_value", 2]}

 jsonb_pretty(from_json jsonb)  text  以縮進的格式更容易閱讀的方式返回json對象  select jsonb_pretty('[{"f1":1,"f2":null},2,null,3]');  


  { 
   "f1": 1,
   "f2": null
  }, 
  2,
  null,
  3
]


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • mysql配置文件 mysql的配置文件為/etc/my.cnf 配置文件查找次序:若在多個配置文件中均有設定,則最後找到的最終生效 mysql常用配置文件參數: 參數 |說明 : |: port = 3306 | 設置監聽埠 socket = /tmp/mysql.sock | 指定套接字文件位 ...
  • 摘要 通過前面的基礎學習,本章進入最為激動的機器人自主導航的學習。在前面的學習鋪墊後,終於迎來了最大樂趣的時刻,就是賦予我們的miiboo機器人能自由行走的生命。本章將圍繞機器人SLAM建圖、導航避障、巡航、監控等內容展開。本章內容: 1.在機器人上使用感測器 2.google-cartograph ...
  • usb無線網卡驅動(rtl8192cu) 內核編譯、驅動編譯、iw等工具編譯 環境 板卡:hi3559av100(arm64) 交叉編譯鏈:aarch64-himix100-linux- usb無線網卡:rtl8192cu(ID 0bda:8178) 1、內核編譯 在內核中,不僅要包含相應無線驅動、 ...
  • Transmission簡介 Transmission是一種BitTorrent客戶端,特點是跨平臺的後端和簡潔的用戶界面,硬體資源消耗極少,支持包括Linux、BSD、Solaris、Mac OS X等多種操作系統,以及Networked Media Tank、WD MyBook、ReadyNAS ...
  • 用phpstudy搭建的lnmp環境下mysql授權遠程連接 簡單高效 這是因為mysql 里的優先順序不是所有人(提前檢查防火牆是關閉狀態)1、使用phpstudy安裝的mysql沒有放置到可以直接調用的目錄里,所以只能使用絕對路徑來訪問:/phpstudy/mysql/bin/mysql -u用戶 ...
  • 本次是虛擬機裝的centos7的內核不知原因以外丟失造成無法開機,開機顯示找不到內核! 恢復方法: 掛載新的ISO文件,然後進入bios選擇dvd啟動。 啟動後進入Troublesshooting,然後選擇救援模式Rescue a centos system. 一路continue,ok進入救援模式 ...
  • 1、從docker中獲取mysql8.0.13鏡像 2、運行 mysql8.0.13 鏡像 3、登陸mysql 4、解決方法:進入mysql8.0.13容器 5、在容器裡面登陸資料庫 6、進入mysql庫,查看user表,可以看到root加密方式 7、修改root用戶插件驗證方式: 8、刷新許可權 9 ...
  • key * 查看redis中的所有鍵(當鍵的數量較多會影響性能,不建議生產環境中使用) exists key 判斷一個鍵是否存在,存在返回1,否則返回0 del key [key...] 刪除一個或多個鍵,返回刪除的鍵的個數 (del命令的參數不支持通配符,但我們可以結合linux的管道和xargs ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...