You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL如何高效查询jsonb对象首个可用键的值?

优化PostgreSQL jsonb获取首个键值的SQL查询

针对你需要从listings表的design_titles(jsonb类型)列中获取首个键对应值的需求,原SQL存在两次查询同一条数据的效率问题,且当jsonb对象包含多个键时会直接报错(子查询返回多行)。以下是更高效且健壮的实现方式:

方法一:使用jsonb_each_text横向展开(推荐)

通过横向连接将jsonb对象的键值对展开,直接取第一行的value即可,仅需一次表查询:

SELECT value AS first_design_title
FROM public.listings, jsonb_each_text(design_titles)
WHERE id = '11'
LIMIT 1;

说明:

  • jsonb_each_text(design_titles)会将jsonb对象拆分为多行(key, value)记录,顺序与jsonb对象中键的存储顺序一致(PostgreSQL 10+ 保留插入顺序)
  • 配合LIMIT 1直接获取首个键对应的值,避免了子查询的额外开销,同时解决了多键场景下的报错问题

方法二:使用数组索引获取首个键

如果需要保持单一行的查询结果格式,可以通过聚合函数将键转为数组,再取第一个元素:

SELECT design_titles ->> (array_agg(jsonb_object_keys(design_titles))[1]) AS first_design_title
FROM public.listings
WHERE id = '11'
GROUP BY id, design_titles;

说明:

  • jsonb_object_keys提取所有键,array_agg将键转为数组,[1]取数组第一个元素(PostgreSQL数组索引从1开始)
  • 此方法适合需要在原有行结构中追加结果的场景,但性能略逊于方法一(需聚合操作)

原SQL的问题总结

  1. 重复查询:两次访问id='11'的行,增加不必要的IO开销
  2. 健壮性差:当design_titles包含多个键时,子查询返回多行,会触发more than one row returned by a subquery used as an expression错误

内容的提问来源于stack exchange,提问作者Christian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:45:07