簡體   English   中英

從 JSON 數組字段中查找和/或刪除某些元素的 PostgreSQL 查詢

[英]PostgreSQL query that finds and/or deletes certain elements from JSON array field

我們有一個帶有jsonb[]列的表,該列包含具有各種鍵的JSON對象數組。 數據庫是 PostgreSQL (v9.6)

----------------------------------------------------
| id | data (jsonb[])                              |
----------------------------------------------------
|  1 | [{a:1, B:2, c:3}, {a:4, c:5}, {a:6, B:7}]   |
|  2 | [{a:8}, {B:9, c:10}]                        |
|  3 | [{a:11}]                                    |
----------------------------------------------------

我們想刪除或設置為清空B 的所有值

所以,我們想得到

---------------------------------------------------------------
| id | data (jsonb[])                                         |
---------------------------------------------------------------
|  1 | [{a:1, B:null/"", c:3}, {a:4, c:5}, {a:6, B:null/""}]  |
|  2 | [{a:8}, {B:null/"", c:10}]                             |
|  3 | [{a:11}]                                               |
---------------------------------------------------------------

或者

------------------------------------------
| id | data (jsonb[])                    |
------------------------------------------
|  1 | [{a:1, c:3}, {a:4, c:5}, {a:6}]   |
|  2 | [{a:8}, {c:10}]                   |
|  3 | [{a:11}]                          |
------------------------------------------

如果沒有簡單的方法來更新 B 字段,我們很樂意找到一種方法來獲取所有具有 B 的記錄:在數據字段中,在這種情況下,我們可以加載所有記錄並在 DB 外處理它們。

到目前為止,我們無法找到一種方法來做到這一點,甚至無法找到所有具有 B: 字段的記錄。

任何想法都會很棒,謝謝!

您可以通過UNNEST Array --> Subtract Element --> Aggregate方法來實現

如果要刪除元素,請嘗試以下操作:

select 
id,
jsonb_agg(y-'B') 
from test cross join lateral unnest(data) x(y)
group by id

演示

如果要設置元素NULL的值,請嘗試以下操作:

select 
id, 
jsonb_agg(jsonb_set(y,'{B}','null',false)) 
from test cross join lateral unnest(data) x(y)
group by id

演示

根據評論編輯:

with cte as (
select 
id,
array_agg(y-'B') "data"
from test cross join lateral unnest(data) x(y)
group by id
)

update test t1 set data = t2.data from cte t2 where t1.id=t2.id;

小提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM