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