簡體   English   中英

JSONB到數組數據類型

[英]JSONB to Array Data Type

我目前有一個表會話,其中包含列actions(JSONB)。

我可以使用array_to_jsonb(array value)從前端將數組正確存儲到數據庫中。

我的數組的結構(數組值)如下所示:

var arrayStructure = [
    {name: 'email client', check: false},
    {name: 'send contract', check: false}
]

與我在SO上看到的有關修改JSONB或訪問某些鍵的很多問題不同,我只對將整個JSONB數據轉換回前端數組感興趣。

我的臨時解決方法是通過數組進行映射,並使用Javascript中的JSON.parse()重組數組中的每個對象。 我無法在整個數組上使用JSON.parse(),因為它會引發錯誤。

我正在尋找將數組格式恢復為存儲的JSONB數據類型的查詢。 我看過JSONB_SET,LATERAL和JSONB_ARRAY_ELEMENTS_TEXT。 但是,這種方式無法恢復適當的數組。

以As開頭 JSONB在名為session的表的action列中

結果應為:該查詢返回所有行,但將操作列(JSONB)轉換回前端的數組:

select session_id, session_name, someFunction or lateral here(actions) from sessions

會話表的屏幕截圖

我試過這樣的查詢:

SELECT 
   session_id, 
   actions::jsonb -> 'name' as name
FROM sessions;

並返回名稱的null。 我已經嘗試過->>來訪問更深層次的內容,但這也不起作用。

這是正確查詢結果的一半:

select session_id, jsonb_array_elements_text(actions)
from sessions
group by session_id;

結果(僅注意session_id為264的結果 ): 查詢結果

現在我在自己的行中有對象,如下所示:

 {"name": "some task", "check": "false} 

當我想要的操作列是:

[ {name: "some task", check: false}, {name: "other task", check: true} ]

因此,我需要進一步解析JSON並按session_id進行分組。 我只是在努力建立一個做到這一點的子查詢。

創建設置的步驟:

create table fakeSessions (
session_id serial primary key, 
name varchar(20), 
list jsonb
)

insert into fakeSessions(name, list)
VALUES(
'running',
'["{\"name\":\"inquired\",\"check\":false}", "{\"name\":\"sent online guide\",\"check\":false}", "{\"name\":\"booked!\",\"check\":false}"]'
)

insert into fakeSessions(name, list)
VALUES(
'snowboarding',
'["{\"name\":\"rental\",\"check\":false}", "{\"name\":\"booked ski passes\",\"check\":false}", "{\"name\":\"survey\",\"check\":false}"]'
)

我創建的最接近的查詢:

with exports as (
    select jsonb_array_elements_text(actions)::jsonb as doc from sessions
)
select array_agg(doc) from
exports, sessions
group by session_id;

獲取文本值,然后將聚合函數應用於返回的那些行。 只是無法使select array_agg(doc)正常工作。 最可能是因為我需要在那個地方使用其他功能。

這有幫助嗎?

演示:分貝<>小提琴

SELECT
    jsonb_agg(elem) 
FROM
    sessions, jsonb_array_elements(actions) as elem
  1. jsonb_array_elements()jsonb數組擴展為每個jsonb元素一行
  2. jsonb_agg()將這些jsonb元素聚合為一個大數組。

通過構建您的查詢,我能夠找到答案! 非常感謝。 得到預期結果的查詢是這樣的:

with exports as (
    select session_id, jsonb_array_elements_text(actions)::jsonb as doc from sessions
)
select session_id, jsonb_agg(doc) from exports
group by session_id;

一旦獲得元素,就不再使用jsonb_agg()函數。 獲得確切格式的區別只是使用jsonb_array_elements_text::jsonb

暫無
暫無

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

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