PostgreSQL 11中如何从jsonb数组获取指定条件的start_at值
PostgreSQL 11 获取jsonb数组中order=0对象的start_at值
针对你的需求,在PostgreSQL 11中可以通过两种更直接的方式实现,无需复杂的聚合操作:
方法一:直接访问数组指定位置(适用于order=0的对象是数组第一个元素的场景)
如果可以确定tasks数组里order=0的对象始终是第一个元素(如你的数据样例),直接使用jsonb数组索引和字段提取操作符即可:
SELECT tasks->0->>'start_at' FROM requests WHERE id = 1;
tasks->0:获取tasks数组的第一个元素(jsonb对象)->>'start_at':提取该对象中start_at字段的文本值
方法二:过滤数组元素(适用于order=0的对象位置不确定的场景)
如果order=0的对象可能出现在数组任意位置,需要先展开数组元素再筛选:
SELECT elem->>'start_at' FROM requests, jsonb_array_elements(tasks) AS elem WHERE id = 1 AND elem->>'order' = '0';
如果存在多个order=0的对象,想要仅获取第一个匹配值,可以结合聚合函数:
SELECT (array_agg(elem->>'start_at'))[1] FROM requests, jsonb_array_elements(tasks) AS elem WHERE id = 1 AND elem->>'order' = '0';
说明
你之前尝试的语句使用了jsonb_agg(row_to_json(jb)),这是不必要的——因为你查询的是单条记录(id=1),直接操作tasks列即可,无需将整行数据转成JSON再聚合,反而增加了复杂度。
内容的提问来源于stack exchange,提问作者Kingsley Simon
相关产品推荐
相关产品推荐

