我幾天來一直在尋找解決方案,但還沒有成功。我嘗試了與其他人的答案不同的代碼片段,但不知何故到目前為止沒有任何效果。
我想從 PostgreSQL 中的 JSONB 列中洗掉 JSON 資料。
我正在嘗試洗掉下一個語法:
{
"name": "vmi2",
"path": "efefe\\feff\\\fefefe",
"type": "Gym"
}
這是我的 JSON 在 PostgreSQL 中的樣子:
[
{
"name": "vmi2",
"path": "efefe\\feff\\\fefefe",
"type": "Gym"
},
{
"name": "vmi",
"path": "efefe\\feff\\\fefefe",
"type": "Gym"
},
{
"name": "vmi3",
"path": "efefe\\feff\\\fefefe",
"type": "Gym"
}
]
這就是我將新資料附加到其中的方式(作品):
UPDATE my_users
SET json_workouts =
COALESCE(json_workouts, '[]'::JSONB) || '{"name": "vmi3", "path":
"efefe\\feff\\\fefefe", "type": "Gym"}'
WHERE username = 'c';
這些是我嘗試洗掉資料的 2 個查詢。兩者都不起作用,盡管我從同一篇文章中查找了這些代碼(也洗掉和附加查詢):
第一個“洗掉”查詢(不起作用):
DELETE FROM my_users
WHERE json_workouts ->> 'name' = 'vmi2';
第二個“洗掉”查詢。(不起作用)
UPDATE my_users
SET json_workouts = json_workouts - 'name'
WHERE username = 'c';
uj5u.com熱心網友回復:
我了解您想根據name每個元素的屬性從 JSON 陣列中過濾出一個(或多個)元素。
一種方法是取消嵌套 JSON 陣列,過濾掉不需要的元素,然后重新聚合。
假設像這樣的表t(id, js),其中id是主鍵并且js是一jsonb列,您可以執行以下操作:
select t.id, jsonb_agg(j.elt order by j.idx) as new_js
from t
cross join lateral jsonb_array_elements(t.js) with ordinality as j(elt, idx)
where j.elt ->> 'name' != 'vmi2'
group by t.id
這是一個關于 DB Fiddle 的小演示;對于您的示例資料,查詢回傳:
| ID | new_js |
|---|---|
| 1 | [ ????{ ????????“名稱”:“vmi”, ????????“路徑”:“efefe\feff\\fefefe”, ????????“型別”:“健身房” ????}, ????{ ????????“名稱”:“vmi3”, ????????“路徑”:“efefe\feff\ \fefefe", ????????"type": "健身房" ????} ] |
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/528924.html
