[英]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
jsonb_array_elements()
將jsonb
數組擴展為每個jsonb
元素一行 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.