PostgreSQLjson任意位置append功能實現
標籤
PostgreSQL , json , 合併 , replace , append
背景
在JSON的任意位置,插入或append一段。目前PG內建函式不支援,需要複雜的SQL。
目前支援的內建操作符和函式如下:
https://www.postgresql.org/docs/current/static/functions-json.html
現在有一個這樣的需求,在對應某個PATH的位置APPEND幾個值。
{"time": "1", "queue": {"digoal": {"a": 0}}}
修改為
{"time": "1", "queue": {"digoal": {"a": 0, "b": 1, "c": 2}}}
實現
首先提取對應位置的值,然後concat,最後SET對應PATH的值,達到追加的效果。
postgres=# select jsonb_set(js, `{queue, digoal}`, jsonb_extract_path(jsonb_extract_path(js, `queue`),`digoal`)||`{"b":1, "c":2}`) from (values (`{"queue":{"digoal":{"a":0}} , "time": "1"}`::jsonb) ) as t (js);
jsonb_set
------------------------------------------------------------------------------
{"time": "1", "queue": {"digoal": {"a": 0, "b": 1, "c": 2}}}
(1 row)
postgres=# select js from (values (`{"queue":{"digoal":{"a":0}} , "time": "1"}`::jsonb) ) as t (js);
js
--------------------------------------------------------------
{"time": "1", "queue": {"digoal": {"a": 0}}}
(1 row)
使用函式,簡化SQL,如下:
create or replace function jsonb_append(js jsonb, jsapp jsonb, text[]) returns jsonb as $$
declare
x text;
sql text := format(`%L`, js);
tmp jsonb;
res jsonb;
begin
foreach x in array $3 loop
sql := format (`jsonb_extract_path(%s, %L)`, sql, x) ;
-- raise notice `%`, sql;
end loop;
EXECUTE format(`select jsonb_concat(%s, %L)`, sql, jsapp) INTO tmp;
res := jsonb_set(js, $3, tmp);
return res;
end;
$$ language plpgsql strict;
以上SQL改成這樣既可,第一個參數列示原始JSON,第二個參數列示需要追加的JSON,第三個參數列示位置。
postgres=# select jsonb_append(js, `{"b":1, "c":2}`, `{queue, digoal}`) from (values (`{"queue":{"digoal":{"a":0}} , "time": "1"}`::jsonb)) t(js);
jsonb_append
------------------------------------------------------------------------------
{"time": "1", "queue": {"digoal": {"a": 0, "b": 1, "c": 2}}}
(1 row)
相關文章
- 調換任意字串位置字串
- Js實現任意位置縮放圖片,深入理解背後原理JS
- js實現的在li元素列表的任意位置插入一個新的li元素JS
- 執行任意位置的 PHP 檔案PHP
- 獲取棧中任意位置的元素
- Spring Boot 2 實戰:利用Redis的Geo功能實現查詢附近的位置Spring BootRedis
- jQuery將li元素插入列表中任意位置jQuery
- 第九周(11.11-11.17)----結對專案----實現任意位置加一對括號
- 前端--任意數求和(有名函式實現)前端函式
- PostgreSQLjson索引實踐-檢索(存在、包含、等值、範圍等)加速SQLJSON索引
- Flutter - 利用 ClipPath 實現任意形狀 WidgetFlutter
- 任意程式上的蒙版畫筆實現
- 使用JWT、攔截器與ThreadLocal實現在任意位置獲取Token中的資訊,並結合自定義註解實現對方法的鑑權JWTthread
- 動態規劃實現O(n)爆破任意加密動態規劃加密
- FloatWindow 輕鬆實現安卓任意介面懸浮窗安卓
- 巧用ROW_NUMBER 實現SQL資料任意排序SQL排序
- win10在任意位置安裝Linux子系統Win10Linux
- MySQL空間函式實現位置打卡MySql函式
- 如何用HMS Core位置和地圖服務實現附近地點路徑規劃功能地圖
- 實現微信分享功能
- 前端實現水印功能前端
- oracle實現"limit"功能OracleMIT
- 16 支付功能實現
- C++實現任意進位制的相互轉換C++
- javascript實現的任意擷取字串中的子字串JavaScript字串
- 在Delphi中實現任意形狀的窗體 (轉)
- 如何用華為位置服務實現搜尋位置返回父子節點資訊
- iOS後臺模式藉助位置更新實現iOS模式
- 通過spring,在專案的任意位置獲取當前RequestSpring
- 自定義bmp影像縮放及在lcd螢幕任意位置顯示
- 實現指定任意數量的方塊EditText容器BlockEditTextViewGroupBloCTextView
- C#實現任意源組播與特定源組播C#
- 動態的實現任意表的ALV顯示02
- 動態的實現任意表的ALV顯示01
- 關於append sql hint的實驗APPSQL
- JS實現線上ps功能JS
- canvas拼圖功能實現Canvas
- 用pandas實現SQL功能SQL