簡體   English   中英

如何從 Postgres 中的 JSON 數組中刪除 JSON 對象?

[英]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.

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