[英]How to delete JSON Object from JSON array in Postgres?
我是 Postgres 的新手。 我想從 JSON 數組中刪除 JSON 對象。
我有一個表,我在其中使用 jsonb 列,因為我正在存儲 JSON 數組,如下所示。
[
{
"id": "c75e7a-001e-4d64-9613-62f666d42103",
"name": "Product1"
},
{
"id": "c75e7a-001e-4d64-9613-62f666d42103",
"name": null
},
{
"id": "c75e7a-001e-4d64-9613-62f666d42103",
"name": "Product2"
},
{
"id": "c75e7a-001e-4d64-9613-62f666d42103",
"name": null
}
]
我想從名稱鍵中包含空值的數組中刪除 JSON 對象。
刪除答案后應該是這樣的
[
{
"id": "c75e7a-001e-4d64-9613-62f666d42103",
"name": "Product1"
},
{
"id": "c75e7a-001e-4d64-9613-62f666d42103",
"name": "Product2"
}
]
任何人,請幫我編寫 SQL 查詢,
我知道如何從包含空值的表中獲取所有記錄。
SELECT *
FROM table_name
WHERE jsonb_col_name @>CAST('[{"name": null}]' AS JSONB);
但我不知道如何進行刪除查詢,請幫我解決這個問題。 我如何使用查詢來做到這一點?
與陣列UNNEST jsonb_array_elements
,排除null
了值FILTER
,再比如他們聚集
SELECT
jsonb_agg(j) FILTER (WHERE j->>'name' IS NOT NULL)
FROM table_name t, jsonb_array_elements(jsonb_col) j
GROUP BY t.jsonb_col;
演示: db<>fiddle
在使用JSONB_ARRAY_ELEMENTS
將數組拆分為子對象后,您可以通過j.value ->> 'name' IS NOT NULL
過濾掉,然后應用JSONB_AGG
以將其轉換回數組,例如
SELECT JSONB_PRETTY(
JSONB_AGG(j)
)
FROM t,
JSONB_ARRAY_ELEMENTS(json_data) AS j
WHERE j.value ->> 'name' IS NOT NULL
GROUP BY json_data
如果需要更新現有數據,那么您可以考慮使用
WITH tt AS
(
SELECT JSONB_AGG(j) AS new_val,
json_data
FROM t,
JSONB_ARRAY_ELEMENTS(json_data) AS j
WHERE j.value ->> 'name' IS NOT NULL
GROUP BY json_data
)
UPDATE t
SET json_data = new_val::JSONB
FROM tt
WHERE t.json_data = tt.json_data
您可以使用json_array_elements
:
select json_agg(i.value) from json_array_elements('[{"id": "c75e7a-001e-4d64-9613-62f666d42103", "name": "Product1"}, {"id": "c75e7a-001e-4d64-9613-62f666d42103", "name": null}, {"id": "c75e7a-001e-4d64-9613-62f666d42103", "name": "Product2"}, {"id": "c75e7a-001e-4d64-9613-62f666d42103", "name": null}]') v
where (v.value -> 'name')::text != 'null'
輸出:
[{"id": "c75e7a-001e-4d64-9613-62f666d42103", "name": "Product1"}, {"id": "c75e7a-001e-4d64-9613-62f666d42103", "name": "Product2"}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.