JSONB到数组数据类型



我目前有一个带有列操作的表会话(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。但在某种程度上,这并不能让我们找回一个合适的阵列。

启动为:表命名会话中操作列中的JSONB

应返回结果:返回所有行的查询,但操作列(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;

结果是这样的(只关注264的session_id的结果(:查询结果

现在我在它们自己的行中有对象作为:

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

当我想要的操作列是:

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

因此,我需要通过session_id进一步解析JSON和group。我只是在努力构建一个能做到这一点的子查询。

创建设置的步骤:

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(按预期工作。很可能是因为我在那个地方需要一个不同的功能。

这有帮助吗?

演示:db<gt;小提琴

SELECT
jsonb_agg(elem) 
FROM
sessions, jsonb_array_elements(actions) as elem
  1. jsonb_array_elements()jsonb数组扩展为每个jsonb元素一行
  2. CCD_ 5将这些CCD_

我能够通过构建您的查询来找到答案!非常感谢。得到预期结果的查询是:

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

最新更新