簡體   English   中英

將字符串數組轉換為 Postgresql Jsonb 中的 Json 對象數組

[英]Convert array of string to array of Json objects in Postgresql Jsonb

我有一個像

{
    "foo":{"bar" :["b","c","d"]}
}

我想將“bar”數組的所有項目轉換為 json 與“名稱”鍵結果應為:

{
    "foo":{"bar" :[{"name":"b"},{"name":"c"},{"name":"d"}]}
}

我希望在我的表的所有行中使用 postgresql 查詢來做到這一點。

我嘗試了各種查詢和函數,但我的主要問題是包裝我的部分字符串。

提示和幫助已得到應用

假設您使用的是支持 JSON 的 Postgres 版本(9.4+),這應該會讓您接近:

WITH cte(myJSON) AS (
  SELECT CAST('{"foo":{"bar" :["b","c","d"]}}'AS JSONB) AS MyJSON 

  UNION ALL

  SELECT CAST('{"foo":{"bar" :["e","f","g"]}}'AS JSONB) AS MyJSON  
) 

SELECT
  JSON_AGG(
    (SELECT ROW_TO_JSON(_) FROM (SELECT name) AS _)
  ) myrow
FROM (
  SELECT JSONB_ARRAY_ELEMENTS(myjson->'foo'->'bar') AS name,
    ROW_NUMBER() OVER() AS RowNum
  FROM cte
) src
GROUP BY src.RowNum

這將返回[{"name":"b"},{"name":"c"},{"name":"d"}]

然后,您可以根據需要構建最終的JSON

SQL 小提琴
參考

更新
這非常hacky,我確信有一種更簡潔的方法,但我更新了上面的查詢以處理多行。 只需將CTE引用替換為您的實際表名稱,並將myjson替換為JSON列的名稱。

Output:

[{"name":"b"},{"name":"c"},{"name":"d"}]
[{"name":"e"},{"name":"f"},{"name":"g"}]

讓我知道這是否有效。

更新更新
這是您可以使用的UPDATE語句:

UPDATE t1 tgt
SET jsoncol = JSONB_SET(
  jsoncol, -- Source JSON
  '{foo,bar}', -- Target node to update
  src.new_json -- New value 
)
FROM (
  SELECT 
    ID, 
    JSONB_AGG(
      (SELECT TO_JSONB(_) FROM (SELECT name) AS _) -- Convert new row to JSON
    ) new_json
  FROM (
    SELECT 
      ID, 
      JSONB_ARRAY_ELEMENTS(jsoncol->'foo'->'bar') AS name -- Convert array to rows
    FROM t1
  ) src
  GROUP BY src.ID
) src
WHERE tgt.ID = src.ID -- Update "tgt" table with rows from "src" table
;

DB-小提琴

暫無
暫無

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

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